解决了语音上传到问题,接下来要解决下载播放问题

This commit is contained in:
joywayer
2025-06-15 12:36:47 +08:00
parent bba3ed1cb4
commit c11fc62bf1
513 changed files with 31197 additions and 2969 deletions

295
Pods/Qiniu/QiniuSDK/Storage/QNBaseUpload.m generated Normal file
View File

@@ -0,0 +1,295 @@
//
// QNBaseUpload.m
// QiniuSDK
//
// Created by WorkSpace_Sun on 2020/4/19.
// Copyright © 2020 Qiniu. All rights reserved.
//
#import "QNAutoZone.h"
#import "QNZoneInfo.h"
#import "QNResponseInfo.h"
#import "QNDefine.h"
#import "QNBaseUpload.h"
#import "QNUploadDomainRegion.h"
NSString *const QNUploadUpTypeForm = @"form";
NSString *const QNUploadUpTypeResumableV1 = @"resumable_v1";
NSString *const QNUploadUpTypeResumableV2 = @"resumable_v2";
@interface QNBaseUpload ()
@property (nonatomic, strong) QNBaseUpload *strongSelf;
@property (nonatomic, copy) NSString *key;
@property (nonatomic, copy) NSString *fileName;
@property (nonatomic, strong) NSData *data;
@property (nonatomic, strong) id <QNUploadSource> uploadSource;
@property (nonatomic, strong) QNUpToken *token;
@property (nonatomic, copy) NSString *identifier;
@property (nonatomic, strong) QNUploadOption *option;
@property (nonatomic, strong) QNConfiguration *config;
@property (nonatomic, strong) id <QNRecorderDelegate> recorder;
@property (nonatomic, copy) NSString *recorderKey;
@property (nonatomic, strong) QNUpTaskCompletionHandler completionHandler;
@property (nonatomic, assign)NSInteger currentRegionIndex;
@property (nonatomic, strong)NSMutableArray <id <QNUploadRegion> > *regions;
@property (nonatomic, strong)QNUploadRegionRequestMetrics *currentRegionRequestMetrics;
@property (nonatomic, strong) QNUploadTaskMetrics *metrics;
@end
@implementation QNBaseUpload
- (instancetype)initWithSource:(id<QNUploadSource>)uploadSource
key:(NSString *)key
token:(QNUpToken *)token
option:(QNUploadOption *)option
configuration:(QNConfiguration *)config
recorder:(id<QNRecorderDelegate>)recorder
recorderKey:(NSString *)recorderKey
completionHandler:(QNUpTaskCompletionHandler)completionHandler{
return [self initWithSource:uploadSource data:nil fileName:[uploadSource getFileName] key:key token:token option:option configuration:config recorder:recorder recorderKey:recorderKey completionHandler:completionHandler];
}
- (instancetype)initWithData:(NSData *)data
key:(NSString *)key
fileName:(NSString *)fileName
token:(QNUpToken *)token
option:(QNUploadOption *)option
configuration:(QNConfiguration *)config
completionHandler:(QNUpTaskCompletionHandler)completionHandler{
return [self initWithSource:nil data:data fileName:fileName key:key token:token option:option configuration:config recorder:nil recorderKey:nil completionHandler:completionHandler];
}
- (instancetype)initWithSource:(id<QNUploadSource>)uploadSource
data:(NSData *)data
fileName:(NSString *)fileName
key:(NSString *)key
token:(QNUpToken *)token
option:(QNUploadOption *)option
configuration:(QNConfiguration *)config
recorder:(id<QNRecorderDelegate>)recorder
recorderKey:(NSString *)recorderKey
completionHandler:(QNUpTaskCompletionHandler)completionHandler{
if (self = [super init]) {
_uploadSource = uploadSource;
_data = data;
_fileName = fileName ?: @"?";
_key = key;
_token = token;
_config = config;
_option = option ?: [QNUploadOption defaultOptions];
_recorder = recorder;
_recorderKey = recorderKey;
_completionHandler = completionHandler;
[self initData];
}
return self;
}
- (instancetype)init{
if (self = [super init]) {
[self initData];
}
return self;
}
- (void)initData{
_strongSelf = self;
_currentRegionIndex = 0;
}
- (void)run {
[self.metrics start];
kQNWeakSelf;
[_config.zone query:self.config token:self.token on:^(QNResponseInfo * _Nullable responseInfo, QNUploadRegionRequestMetrics * _Nullable metrics, QNZonesInfo * _Nullable zonesInfo) {
kQNStrongSelf;
self.metrics.ucQueryMetrics = metrics;
if (responseInfo != nil && responseInfo.isOK && zonesInfo) {
if (![self setupRegions:zonesInfo]) {
responseInfo = [QNResponseInfo responseInfoWithInvalidArgument:[NSString stringWithFormat:@"setup regions host fail, origin response:%@", responseInfo]];
[self complete:responseInfo response:responseInfo.responseDictionary];
return;
}
int prepareCode = [self prepareToUpload];
if (prepareCode == 0) {
[self startToUpload];
} else {
QNResponseInfo *responseInfoP = [QNResponseInfo errorResponseInfo:prepareCode errorDesc:nil];
[self complete:responseInfoP response:responseInfoP.responseDictionary];
}
} else {
if (responseInfo == nil) {
// responseInfo
responseInfo = [QNResponseInfo responseInfoWithSDKInteriorError:@"can't get regions"];
}
[self complete:responseInfo response:responseInfo.responseDictionary];
}
}];
}
- (BOOL)reloadUploadInfo {
return YES;
}
- (int)prepareToUpload{
return 0;
}
- (void)startToUpload{
self.currentRegionRequestMetrics = [[QNUploadRegionRequestMetrics alloc] initWithRegion:[self getCurrentRegion]];
[self.currentRegionRequestMetrics start];
}
//
- (BOOL)switchRegionAndUpload{
if (self.currentRegionRequestMetrics) {
[self.currentRegionRequestMetrics end];
[self.metrics addMetrics:self.currentRegionRequestMetrics];
self.currentRegionRequestMetrics = nil;
}
BOOL isSwitched = [self switchRegion];
if (isSwitched) {
[self startToUpload];
}
return isSwitched;
}
// regionreturn:region
- (BOOL)switchRegionAndUploadIfNeededWithErrorResponse:(QNResponseInfo *)errorResponseInfo {
if (errorResponseInfo.statusCode == 400 && [errorResponseInfo.message containsString:@"incorrect region"]) {
[QNAutoZone clearCache];
}
if (!errorResponseInfo || errorResponseInfo.isOK || // ||
![errorResponseInfo couldRetry] || ![self.config allowBackupHost]) { //
return false;
}
if (self.currentRegionRequestMetrics) {
[self.currentRegionRequestMetrics end];
[self.metrics addMetrics:self.currentRegionRequestMetrics];
self.currentRegionRequestMetrics = nil;
}
// & Resource index
if (![self reloadUploadInfo]) {
return false;
}
// context
if (!errorResponseInfo.isCtxExpiedError && ![self switchRegion]) {
// context region
return false;
}
[self startToUpload];
return true;
}
- (void)complete:(QNResponseInfo *)info
response:(NSDictionary *)response{
[self.metrics end];
[self.currentRegionRequestMetrics end];
if (self.currentRegionRequestMetrics) {
[self.metrics addMetrics:self.currentRegionRequestMetrics];
}
if (self.completionHandler) {
self.completionHandler(info, _key, _metrics, response);
}
self.strongSelf = nil;
}
//MARK:-- region
- (BOOL)setupRegions:(QNZonesInfo *)zonesInfo{
if (zonesInfo == nil || zonesInfo.zonesInfo == nil || zonesInfo.zonesInfo.count == 0) {
return NO;
}
NSMutableArray *defaultRegions = [NSMutableArray array];
NSArray *zoneInfos = zonesInfo.zonesInfo;
for (QNZoneInfo *zoneInfo in zoneInfos) {
QNUploadDomainRegion *region = [[QNUploadDomainRegion alloc] initWithConfig:self.config];
[region setupRegionData:zoneInfo];
if (region.isValid) {
[defaultRegions addObject:region];
}
}
self.regions = defaultRegions;
self.metrics.regions = defaultRegions;
return defaultRegions.count > 0;
}
- (void)insertRegionAtFirst:(id <QNUploadRegion>)region{
BOOL hasRegion = NO;
for (id <QNUploadRegion> regionP in self.regions) {
if ([regionP.zoneInfo.regionId isEqualToString:region.zoneInfo.regionId]) {
hasRegion = YES;
break;
}
}
if (!hasRegion) {
[self.regions insertObject:region atIndex:0];
}
}
- (BOOL)switchRegion{
BOOL ret = NO;
@synchronized (self) {
NSInteger regionIndex = _currentRegionIndex + 1;
if (regionIndex < self.regions.count) {
_currentRegionIndex = regionIndex;
ret = YES;
}
}
return ret;
}
- (id <QNUploadRegion>)getTargetRegion{
return self.regions.firstObject;
}
- (id <QNUploadRegion>)getCurrentRegion{
id <QNUploadRegion> region = nil;
@synchronized (self) {
if (self.currentRegionIndex < self.regions.count) {
region = self.regions[self.currentRegionIndex];
}
}
return region;
}
- (void)addRegionRequestMetricsOfOneFlow:(QNUploadRegionRequestMetrics *)metrics{
if (metrics == nil) {
return;
}
@synchronized (self) {
if (self.currentRegionRequestMetrics == nil) {
self.currentRegionRequestMetrics = metrics;
return;
}
}
[self.currentRegionRequestMetrics addMetrics:metrics];
}
- (QNUploadTaskMetrics *)metrics {
if (_metrics == nil) {
_metrics = [QNUploadTaskMetrics taskMetrics:self.upType];
}
return _metrics;
}
@end