From 1ae200b6e3c8d5c3855871d2d0d31e739227aa36 Mon Sep 17 00:00:00 2001 From: YangSen-qn Date: Tue, 10 Jun 2025 14:44:43 +0800 Subject: [PATCH 1/3] resume version, default to v2 --- QiniuSDK.xcodeproj/project.pbxproj | 2 + QiniuSDK/Storage/QNConfiguration.h | 20 +++++++- QiniuSDK/Storage/QNConfiguration.m | 76 ++++++++++++++++++----------- QiniuSDK/Storage/QNUploadManager.h | 7 +-- QiniuSDK/Utils/QNVersion.h | 2 +- QiniuSDKTests/QNCFHttpClientTest.m | 4 +- QiniuSDKTests/QNConfigurationTest.m | 7 +++ QiniuSDKTests/QNResumeUploadTest.m | 4 +- 8 files changed, 84 insertions(+), 38 deletions(-) diff --git a/QiniuSDK.xcodeproj/project.pbxproj b/QiniuSDK.xcodeproj/project.pbxproj index 488dd254..81b62bb4 100644 --- a/QiniuSDK.xcodeproj/project.pbxproj +++ b/QiniuSDK.xcodeproj/project.pbxproj @@ -637,6 +637,7 @@ 4551E55E24CE81DA00447285 /* QNInetAddress.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = QNInetAddress.m; sourceTree = ""; }; 4551E56524D0065100447285 /* NSData+QNMD5.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSData+QNMD5.h"; sourceTree = ""; }; 4551E56624D0065100447285 /* NSData+QNMD5.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSData+QNMD5.m"; sourceTree = ""; }; + 45B03B702DF80281002148CE /* libHappyDNS-macOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = "libHappyDNS-macOS.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 45CBC6C22AA9B05A00962B47 /* QNFixZoneTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = QNFixZoneTest.m; sourceTree = ""; }; 45CBC6D02ABA9FFF00962B47 /* QNCache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = QNCache.h; sourceTree = ""; }; 45CBC6D12ABA9FFF00962B47 /* QNCache.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = QNCache.m; sourceTree = ""; }; @@ -954,6 +955,7 @@ A955AABD20BF51BFE5032419 /* Frameworks */ = { isa = PBXGroup; children = ( + 45B03B702DF80281002148CE /* libHappyDNS-macOS.a */, F14D0FE3BA304F86A17EDF33 /* libPods-QiniuSDK_Mac.a */, D15EA855D2DBDE6728E87462 /* libPods-QiniuSDK_MacTests.a */, 43AF08370B1B79540BB41B4B /* libPods-QiniuSDK_iOS.a */, diff --git a/QiniuSDK/Storage/QNConfiguration.h b/QiniuSDK/Storage/QNConfiguration.h index e5cb7f9e..a78851e0 100644 --- a/QiniuSDK/Storage/QNConfiguration.h +++ b/QiniuSDK/Storage/QNConfiguration.h @@ -9,6 +9,7 @@ #import #import "QNRecorderDelegate.h" #import "QNDns.h" +#import "QNDefine.h" /** * 断点上传时的分块大小 @@ -133,13 +134,28 @@ typedef void (^QNConfigurationBuilderBlock)(QNConfigurationBuilder *builder); /** * 默认配置 */ -+ (instancetype)defaultConfiguration; ++ (instancetype)defaultConfiguration kQNDeprecated("use defaultConfigurationV2 instead"); + +/** + * 默认配置 + * + * 此默认配置中分片上传使用分片V2,如果是私/专有云场景,请注意确认服务端是否支持分片V2 + */ ++ (instancetype)defaultConfigurationV2; /** * 使用 QNConfigurationBuilder 进行配置 * @param block 配置block */ -+ (instancetype)build:(QNConfigurationBuilderBlock)block; ++ (instancetype)build:(QNConfigurationBuilderBlock)block kQNDeprecated("use buildV2 instead"); + +/** + * 使用 QNConfigurationBuilder 进行配置 + * 此配置中分片上传默认使用分片V2,如果是私/专有云场景,请注意确认服务端是否支持分片V2 + * + * @param block 配置block + */ ++ (instancetype)buildV2:(QNConfigurationBuilderBlock)block; @end diff --git a/QiniuSDK/Storage/QNConfiguration.m b/QiniuSDK/Storage/QNConfiguration.m index 7262a62d..a6d2e4d8 100644 --- a/QiniuSDK/Storage/QNConfiguration.m +++ b/QiniuSDK/Storage/QNConfiguration.m @@ -17,6 +17,43 @@ const UInt32 kQNDefaultDnsCacheTime = 2 * 60; +@interface QNConfigurationBuilder() +@end +@implementation QNConfigurationBuilder + +- (instancetype)init { + if (self = [super init]) { + _zone = [[QNAutoZone alloc] init]; + _chunkSize = 2 * 1024 * 1024; + _putThreshold = 4 * 1024 * 1024; + _retryMax = 1; + _timeoutInterval = 90; + _retryInterval = 0.5; + + _recorder = nil; + _recorderKeyGen = nil; + + _proxy = nil; + _converter = nil; + + _useHttps = YES; + _allowBackupHost = YES; + _accelerateUploading = NO; + _useConcurrentResumeUpload = NO; + _resumeUploadVersion = QNResumeUploadVersionV1; + _concurrentTaskCount = 3; + } + return self; +} + ++ (instancetype)defaultBuilder { + QNConfigurationBuilder *builder = [[QNConfigurationBuilder alloc] init]; + builder.resumeUploadVersion = QNResumeUploadVersionV2; + return builder; +} + +@end + @implementation QNConfiguration + (instancetype)defaultConfiguration{ @@ -24,12 +61,23 @@ + (instancetype)defaultConfiguration{ return [[QNConfiguration alloc] initWithBuilder:builder]; } ++ (instancetype)defaultConfigurationV2{ + QNConfigurationBuilder *builder = [QNConfigurationBuilder defaultBuilder]; + return [[QNConfiguration alloc] initWithBuilder:builder]; +} + + (instancetype)build:(QNConfigurationBuilderBlock)block { QNConfigurationBuilder *builder = [[QNConfigurationBuilder alloc] init]; block(builder); return [[QNConfiguration alloc] initWithBuilder:builder]; } ++ (instancetype)buildV2:(QNConfigurationBuilderBlock)block { + QNConfigurationBuilder *builder = [QNConfigurationBuilder defaultBuilder]; + block(builder); + return [[QNConfiguration alloc] initWithBuilder:builder]; +} + - (instancetype)initWithBuilder:(QNConfigurationBuilder *)builder { if (self = [super init]) { _useConcurrentResumeUpload = builder.useConcurrentResumeUpload; @@ -262,32 +310,4 @@ - (void)setDefaultConnectCheckUrls:(NSArray *)defaultConnectCheckUrls { @end -@implementation QNConfigurationBuilder - -- (instancetype)init { - if (self = [super init]) { - _zone = [[QNAutoZone alloc] init]; - _chunkSize = 2 * 1024 * 1024; - _putThreshold = 4 * 1024 * 1024; - _retryMax = 1; - _timeoutInterval = 90; - _retryInterval = 0.5; - - _recorder = nil; - _recorderKeyGen = nil; - - _proxy = nil; - _converter = nil; - - _useHttps = YES; - _allowBackupHost = YES; - _accelerateUploading = NO; - _useConcurrentResumeUpload = NO; - _resumeUploadVersion = QNResumeUploadVersionV1; - _concurrentTaskCount = 3; - } - return self; -} - -@end diff --git a/QiniuSDK/Storage/QNUploadManager.h b/QiniuSDK/Storage/QNUploadManager.h index 80f78c59..99a79754 100755 --- a/QiniuSDK/Storage/QNUploadManager.h +++ b/QiniuSDK/Storage/QNUploadManager.h @@ -9,6 +9,7 @@ #import #import "QNRecorderDelegate.h" +#import "QNDefine.h" @class QNResponseInfo; @class QNUploadOption; @@ -39,7 +40,7 @@ typedef void (^QNUpCompletionHandler)(QNResponseInfo *info, NSString *key, NSDic * * @return 上传管理类实例 */ -- (instancetype)init; +- (instancetype)init kQNDeprecated("use initWithConfiguration instead"); /** * 使用一个持久化的记录接口进行记录的构造方法 @@ -48,7 +49,7 @@ typedef void (^QNUpCompletionHandler)(QNResponseInfo *info, NSString *key, NSDic * * @return 上传管理类实例 */ -- (instancetype)initWithRecorder:(id)recorder; +- (instancetype)initWithRecorder:(id)recorder kQNDeprecated("use initWithConfiguration instead"); /** * 使用持久化记录接口以及持久化key生成函数的构造方法,默认情况下使用上传存储的key, 如果key为nil或者有特殊字符比如/,建议使用自己的生成函数 @@ -59,7 +60,7 @@ typedef void (^QNUpCompletionHandler)(QNResponseInfo *info, NSString *key, NSDic * @return 上传管理类实例 */ - (instancetype)initWithRecorder:(id)recorder - recorderKeyGenerator:(QNRecorderKeyGenerator)recorderKeyGenerator; + recorderKeyGenerator:(QNRecorderKeyGenerator)recorderKeyGenerator kQNDeprecated("use initWithConfiguration instead"); /** * 使用配置信息生成上传实例 diff --git a/QiniuSDK/Utils/QNVersion.h b/QiniuSDK/Utils/QNVersion.h index 1601f706..48794617 100755 --- a/QiniuSDK/Utils/QNVersion.h +++ b/QiniuSDK/Utils/QNVersion.h @@ -11,4 +11,4 @@ /** * sdk 版本 */ -static NSString *const kQiniuVersion = @"8.8.1"; +static NSString *const kQiniuVersion = @"8.9.0"; diff --git a/QiniuSDKTests/QNCFHttpClientTest.m b/QiniuSDKTests/QNCFHttpClientTest.m index 7c4e17c2..e4222da3 100644 --- a/QiniuSDKTests/QNCFHttpClientTest.m +++ b/QiniuSDKTests/QNCFHttpClientTest.m @@ -45,7 +45,7 @@ - (void)testHttpsGet{ } - (void)testHttpGetByIP{ - NSURL *url = [NSURL URLWithString:@"http://218.98.28.19/v3/query?ak=jH983zIUFIP1OVumiBVGeAfiLYJvwrF45S-t22eu&bucket=zone0-space"]; + NSURL *url = [NSURL URLWithString:@"http://101.251.144.177/v3/query?ak=jH983zIUFIP1OVumiBVGeAfiLYJvwrF45S-t22eu&bucket=zone0-space"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; request.qn_domain = @"uc.qbox.me"; @@ -53,7 +53,7 @@ - (void)testHttpGetByIP{ } - (void)testHttpsGetByIP{ - NSURL *url = [NSURL URLWithString:@"https://218.98.28.19/v3/query?ak=jH983zIUFIP1OVumiBVGeAfiLYJvwrF45S-t22eu&bucket=zone0-space"]; + NSURL *url = [NSURL URLWithString:@"https://101.251.144.177/v3/query?ak=jH983zIUFIP1OVumiBVGeAfiLYJvwrF45S-t22eu&bucket=zone0-space"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; request.qn_domain = @"uc.qbox.me"; diff --git a/QiniuSDKTests/QNConfigurationTest.m b/QiniuSDKTests/QNConfigurationTest.m index 16b8ff92..f86875cb 100644 --- a/QiniuSDKTests/QNConfigurationTest.m +++ b/QiniuSDKTests/QNConfigurationTest.m @@ -23,6 +23,13 @@ - (void)tearDown { // Put teardown code here. This method is called after the invocation of each test method in the class. } +- (void)testConfigDefaultConfig { + QNConfiguration *cfg = [QNConfiguration buildV2:^(QNConfigurationBuilder *builder) { + }]; + XCTAssertTrue(cfg.resumeUploadVersion == QNResumeUploadVersionV2, @"config default resumeUploadVersion error"); +} + + - (void)testGlobalDefaultConfig { QNGlobalConfiguration *cfg = [QNGlobalConfiguration shared]; cfg.udpDnsIpv4Servers = nil; diff --git a/QiniuSDKTests/QNResumeUploadTest.m b/QiniuSDKTests/QNResumeUploadTest.m index 10b4cef9..4809411e 100644 --- a/QiniuSDKTests/QNResumeUploadTest.m +++ b/QiniuSDKTests/QNResumeUploadTest.m @@ -36,7 +36,7 @@ - (void)tearDown { } - (void)testSwitchRegionV1 { - QNConfiguration *config = [QNConfiguration build:^(QNConfigurationBuilder *builder) { + QNConfiguration *config = [QNConfiguration buildV2:^(QNConfigurationBuilder *builder) { builder.resumeUploadVersion = QNResumeUploadVersionV1; builder.useConcurrentResumeUpload = NO; builder.useHttps = YES; @@ -52,7 +52,7 @@ - (void)testSwitchRegionV1 { - (void)testCancelV1 { float cancelPercent = 0.1; - QNConfiguration *config = [QNConfiguration build:^(QNConfigurationBuilder *builder) { + QNConfiguration *config = [QNConfiguration buildV2:^(QNConfigurationBuilder *builder) { builder.resumeUploadVersion = QNResumeUploadVersionV1; builder.useConcurrentResumeUpload = NO; builder.useHttps = YES; From 2af92b0bc683e23aaf6336919285c80c4164ada7 Mon Sep 17 00:00:00 2001 From: YangSen-qn Date: Tue, 10 Jun 2025 14:59:40 +0800 Subject: [PATCH 2/3] version to v8.9.0 --- CHANGELOG.md | 3 +++ Qiniu | 1 + Qiniu.podspec | 2 +- QiniuSDK/Collect/QNUploadInfoReporter.m | 11 ++++++++++- QiniuSDK/Storage/QNConfiguration.h | 3 ++- QiniuSDKTests/QNTestConfig.h | 14 +++++++------- README.md | 3 ++- 7 files changed, 26 insertions(+), 11 deletions(-) create mode 160000 Qiniu diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ba71347..53463610 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,7 @@ #Changelog +## 8.9.0 (2025-06-12) +- 分片上传默认使用 V2 接口 + ## 8.8.1(2024-10-25) - 处理 iOS 18 PHAssetResource 信息 fetch 失败而导致异常问题 diff --git a/Qiniu b/Qiniu new file mode 160000 index 00000000..9873e072 --- /dev/null +++ b/Qiniu @@ -0,0 +1 @@ +Subproject commit 9873e07232c9c6cb13126fe3312d619fcfa5a0a1 diff --git a/Qiniu.podspec b/Qiniu.podspec index 439b792f..e75b1626 100755 --- a/Qiniu.podspec +++ b/Qiniu.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'Qiniu' - s.version = '8.8.1' + s.version = '8.9.0' s.summary = 'Qiniu Resource Storage SDK for iOS and Mac' s.homepage = 'https://github.com/qiniu/objc-sdk' s.social_media_url = 'http://weibo.com/qiniutek' diff --git a/QiniuSDK/Collect/QNUploadInfoReporter.m b/QiniuSDK/Collect/QNUploadInfoReporter.m index f37960f8..0a8f2816 100644 --- a/QiniuSDK/Collect/QNUploadInfoReporter.m +++ b/QiniuSDK/Collect/QNUploadInfoReporter.m @@ -116,8 +116,17 @@ - (void)report:(NSString *)jsonString token:(NSString *)token { } - (void)saveReportJsonString:(NSString *)jsonString { - NSString *finalRecordInfo = [jsonString stringByAppendingString:@"\n"]; NSFileManager *fileManager = [NSFileManager defaultManager]; + if (![fileManager fileExistsAtPath:self.config.recordDirectory]) { + NSError *err; + [fileManager createDirectoryAtPath:self.config.recordDirectory withIntermediateDirectories:YES attributes:nil error:&err]; + if (err) { + NSLog(@"create record directory failed, please check record directory: %@", err.localizedDescription); + return; + } + } + + NSString *finalRecordInfo = [jsonString stringByAppendingString:@"\n"]; if (![fileManager fileExistsAtPath:self.recorderFilePath]) { // 如果recordFile不存在,创建文件并写入首行,首次不上传 [finalRecordInfo writeToFile:_recorderFilePath atomically:YES encoding:NSUTF8StringEncoding error:nil]; diff --git a/QiniuSDK/Storage/QNConfiguration.h b/QiniuSDK/Storage/QNConfiguration.h index a78851e0..5efab61f 100644 --- a/QiniuSDK/Storage/QNConfiguration.h +++ b/QiniuSDK/Storage/QNConfiguration.h @@ -151,7 +151,8 @@ typedef void (^QNConfigurationBuilderBlock)(QNConfigurationBuilder *builder); /** * 使用 QNConfigurationBuilder 进行配置 - * 此配置中分片上传默认使用分片V2,如果是私/专有云场景,请注意确认服务端是否支持分片V2 + * 配置中分片上传默认使用分片V2,如果是私/专有云场景,请注意确认服务端是否支持分片V2 + * 分片V2上传更快效率更高 * * @param block 配置block */ diff --git a/QiniuSDKTests/QNTestConfig.h b/QiniuSDKTests/QNTestConfig.h index 0eb7ec5e..d6cd42cc 100755 --- a/QiniuSDKTests/QNTestConfig.h +++ b/QiniuSDKTests/QNTestConfig.h @@ -7,15 +7,15 @@ // #import // 华东上传凭证 -static NSString *const token_z0 = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:reEzRSqlUMSEHG0hQuPUDMKyW_I=:eyJzY29wZSI6ImtvZG8tcGhvbmUtem9uZTAtc3BhY2UiLCJkZWFkbGluZSI6MTczNTAyNDY3NCwgInJldHVybkJvZHkiOiJ7XCJmb29cIjokKHg6Zm9vKSwgXCJiYXJcIjokKHg6YmFyKSwgXCJtaW1lVHlwZVwiOiQobWltZVR5cGUpLCBcImhhc2hcIjokKGV0YWcpLCBcImtleVwiOiQoa2V5KSwgXCJmbmFtZVwiOiQoZm5hbWUpLCBcImZzaXplXCI6JChmc2l6ZSl9In0="; +static NSString *const token_z0 = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:LwbCt4jmlgiIbMCQpFHhXOSrSHA=:eyJzY29wZSI6ImtvZG8tcGhvbmUtem9uZTAtc3BhY2UiLCJkZWFkbGluZSI6MTc1NDcyMjc0MCwgInJldHVybkJvZHkiOiJ7XCJmb29cIjokKHg6Zm9vKSwgXCJiYXJcIjokKHg6YmFyKSwgXCJtaW1lVHlwZVwiOiQobWltZVR5cGUpLCBcImhhc2hcIjokKGV0YWcpLCBcImtleVwiOiQoa2V5KSwgXCJmbmFtZVwiOiQoZm5hbWUpLCBcImZzaXplXCI6JChmc2l6ZSl9In0="; // 华北上传凭证 -static NSString *const token_z1 = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:-9Ftu4ya3aY6Kl4UmAr-2Kr3fws=:eyJzY29wZSI6ImtvZG8tcGhvbmUtem9uZTEtc3BhY2UiLCJkZWFkbGluZSI6MTczNTAyNDY3NCwgInJldHVybkJvZHkiOiJ7XCJmb29cIjokKHg6Zm9vKSwgXCJiYXJcIjokKHg6YmFyKSwgXCJtaW1lVHlwZVwiOiQobWltZVR5cGUpLCBcImhhc2hcIjokKGV0YWcpLCBcImtleVwiOiQoa2V5KSwgXCJmbmFtZVwiOiQoZm5hbWUpLCBcImZzaXplXCI6JChmc2l6ZSl9In0="; +static NSString *const token_z1 = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:dXoFt2mVyKOT_Ukj72Yfz_4gEPI=:eyJzY29wZSI6ImtvZG8tcGhvbmUtem9uZTEtc3BhY2UiLCJkZWFkbGluZSI6MTc1NDcyMjc0MCwgInJldHVybkJvZHkiOiJ7XCJmb29cIjokKHg6Zm9vKSwgXCJiYXJcIjokKHg6YmFyKSwgXCJtaW1lVHlwZVwiOiQobWltZVR5cGUpLCBcImhhc2hcIjokKGV0YWcpLCBcImtleVwiOiQoa2V5KSwgXCJmbmFtZVwiOiQoZm5hbWUpLCBcImZzaXplXCI6JChmc2l6ZSl9In0="; // 华南上传凭证 -static NSString *const token_z2 = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:-RwFn3ET4WhuxOrfFLHNOEq7bfE=:eyJzY29wZSI6ImtvZG8tcGhvbmUtem9uZTItc3BhY2UiLCJkZWFkbGluZSI6MTczNTAyNDY3NCwgInJldHVybkJvZHkiOiJ7XCJmb29cIjokKHg6Zm9vKSwgXCJiYXJcIjokKHg6YmFyKSwgXCJtaW1lVHlwZVwiOiQobWltZVR5cGUpLCBcImhhc2hcIjokKGV0YWcpLCBcImtleVwiOiQoa2V5KSwgXCJmbmFtZVwiOiQoZm5hbWUpLCBcImZzaXplXCI6JChmc2l6ZSl9In0="; +static NSString *const token_z2 = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:d3I7XAZN-4SEGKw-u0gkriRoIaY=:eyJzY29wZSI6ImtvZG8tcGhvbmUtem9uZTItc3BhY2UiLCJkZWFkbGluZSI6MTc1NDcyMjc0MCwgInJldHVybkJvZHkiOiJ7XCJmb29cIjokKHg6Zm9vKSwgXCJiYXJcIjokKHg6YmFyKSwgXCJtaW1lVHlwZVwiOiQobWltZVR5cGUpLCBcImhhc2hcIjokKGV0YWcpLCBcImtleVwiOiQoa2V5KSwgXCJmbmFtZVwiOiQoZm5hbWUpLCBcImZzaXplXCI6JChmc2l6ZSl9In0="; // 北美上传凭证 -static NSString *const token_na0 = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:DG4ueOMNGjrLsYh9OeU7qQ1oY8w=:eyJzY29wZSI6ImtvZG8tcGhvbmUtem9uZS1uYTAtc3BhY2UiLCJkZWFkbGluZSI6MTczNTAyNDY3NCwgInJldHVybkJvZHkiOiJ7XCJmb29cIjokKHg6Zm9vKSwgXCJiYXJcIjokKHg6YmFyKSwgXCJtaW1lVHlwZVwiOiQobWltZVR5cGUpLCBcImhhc2hcIjokKGV0YWcpLCBcImtleVwiOiQoa2V5KSwgXCJmbmFtZVwiOiQoZm5hbWUpLCBcImZzaXplXCI6JChmc2l6ZSl9In0="; +static NSString *const token_na0 = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:Ydxcj_phSH4hOEVQ5CbFhBbBt2I=:eyJzY29wZSI6ImtvZG8tcGhvbmUtem9uZS1uYTAtc3BhY2UiLCJkZWFkbGluZSI6MTc1NDcyMjc0MCwgInJldHVybkJvZHkiOiJ7XCJmb29cIjokKHg6Zm9vKSwgXCJiYXJcIjokKHg6YmFyKSwgXCJtaW1lVHlwZVwiOiQobWltZVR5cGUpLCBcImhhc2hcIjokKGV0YWcpLCBcImtleVwiOiQoa2V5KSwgXCJmbmFtZVwiOiQoZm5hbWUpLCBcImZzaXplXCI6JChmc2l6ZSl9In0="; // 东南亚上传凭证 -static NSString *const token_as0 = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:3nItaASkc5xhSPgzZibr7leZD0U=:eyJzY29wZSI6ImtvZG8tcGhvbmUtem9uZS1hczAtc3BhY2UiLCJkZWFkbGluZSI6MTczNTAyNDY3NCwgInJldHVybkJvZHkiOiJ7XCJmb29cIjokKHg6Zm9vKSwgXCJiYXJcIjokKHg6YmFyKSwgXCJtaW1lVHlwZVwiOiQobWltZVR5cGUpLCBcImhhc2hcIjokKGV0YWcpLCBcImtleVwiOiQoa2V5KSwgXCJmbmFtZVwiOiQoZm5hbWUpLCBcImZzaXplXCI6JChmc2l6ZSl9In0="; +static NSString *const token_as0 = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:nxpWzJ3L3tRtmygY1Aeaoq9hMdo=:eyJzY29wZSI6ImtvZG8tcGhvbmUtem9uZS1hczAtc3BhY2UiLCJkZWFkbGluZSI6MTc1NDcyMjc0MCwgInJldHVybkJvZHkiOiJ7XCJmb29cIjokKHg6Zm9vKSwgXCJiYXJcIjokKHg6YmFyKSwgXCJtaW1lVHlwZVwiOiQobWltZVR5cGUpLCBcImhhc2hcIjokKGV0YWcpLCBcImtleVwiOiQoa2V5KSwgXCJmbmFtZVwiOiQoZm5hbWUpLCBcImZzaXplXCI6JChmc2l6ZSl9In0="; // 华北浙江2上传凭证 -static NSString *const token_cn_east_2 = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:lLrUDlP0vafHDInJXgQ0Qca93CU=:eyJzY29wZSI6ImtvZG8tcGhvbmUtY24tZWFzdC0yIiwiZGVhZGxpbmUiOjE3MzUwMjQ2NzQsICJyZXR1cm5Cb2R5Ijoie1wiZm9vXCI6JCh4OmZvbyksIFwiYmFyXCI6JCh4OmJhciksIFwibWltZVR5cGVcIjokKG1pbWVUeXBlKSwgXCJoYXNoXCI6JChldGFnKSwgXCJrZXlcIjokKGtleSksIFwiZm5hbWVcIjokKGZuYW1lKSwgXCJmc2l6ZVwiOiQoZnNpemUpfSJ9"; -static NSString *const invalidBucketToken = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:RKf4WWQNK8E41Frv_6WmRpjrydo=:eyJzY29wZSI6InpvbmVfaW52YWxpZCIsImRlYWRsaW5lIjoxNzM1MDI0Njc0LCAicmV0dXJuQm9keSI6IntcImZvb1wiOiQoeDpmb28pLCBcImJhclwiOiQoeDpiYXIpLCBcIm1pbWVUeXBlXCI6JChtaW1lVHlwZSksIFwiaGFzaFwiOiQoZXRhZyksIFwia2V5XCI6JChrZXkpLCBcImZuYW1lXCI6JChmbmFtZSksIFwiZnNpemVcIjokKGZzaXplKX0ifQ=="; +static NSString *const token_cn_east_2 = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:B70apmI_Ew0qJNfkna0BEb2klCY=:eyJzY29wZSI6ImtvZG8tcGhvbmUtY24tZWFzdC0yIiwiZGVhZGxpbmUiOjE3NTQ3MjI3NDAsICJyZXR1cm5Cb2R5Ijoie1wiZm9vXCI6JCh4OmZvbyksIFwiYmFyXCI6JCh4OmJhciksIFwibWltZVR5cGVcIjokKG1pbWVUeXBlKSwgXCJoYXNoXCI6JChldGFnKSwgXCJrZXlcIjokKGtleSksIFwiZm5hbWVcIjokKGZuYW1lKSwgXCJmc2l6ZVwiOiQoZnNpemUpfSJ9"; +static NSString *const invalidBucketToken = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:CAE19hb_gvxBHjoWikUdmn2Txxo=:eyJzY29wZSI6InpvbmVfaW52YWxpZCIsImRlYWRsaW5lIjoxNzU0NzIyNzQwLCAicmV0dXJuQm9keSI6IntcImZvb1wiOiQoeDpmb28pLCBcImJhclwiOiQoeDpiYXIpLCBcIm1pbWVUeXBlXCI6JChtaW1lVHlwZSksIFwiaGFzaFwiOiQoZXRhZyksIFwia2V5XCI6JChrZXkpLCBcImZuYW1lXCI6JChmbmFtZSksIFwiZnNpemVcIjokKGZzaXplKX0ifQ=="; diff --git a/README.md b/README.md index 293d1ec0..451de8da 100755 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ File -> Swift Packages -> Add Package Dependency,输入库链接,选择相 库对接: let package = Package( dependencies: [ - .package(url: "https://github.com/qiniu/objc-sdk", from: "8.8.0") + .package(url: "https://github.com/qiniu/objc-sdk", from: "8.9.0") ], // ... ) @@ -37,6 +37,7 @@ let package = Package( | Qiniu SDK 版本 | 最低 iOS版本 | 最低 OS X 版本 | Notes | | :--------------------------------------: | :------: | :--------: | :-----------: | +| 8.9.x | iOS 9 | OS X 10.15 | Xcode 最低版本 11 | | 8.8.x | iOS 9 | OS X 10.15 | Xcode 最低版本 11 | | 8.7.x | iOS 9 | OS X 10.15 | Xcode 最低版本 11 | | 8.6.x | iOS 7 | OS X 10.15 | Xcode 最低版本 11 | From 968ceb28c7f09848ec2c1e1c6786ffabee54dd09 Mon Sep 17 00:00:00 2001 From: YangSen-qn Date: Mon, 16 Jun 2025 14:56:54 +0800 Subject: [PATCH 3/3] chore: update demo --- QiniuDemo/Podfile | 2 +- QiniuDemo/QiniuDemo.xcodeproj/project.pbxproj | 13 ------------- QiniuDemo/QiniuDemo/ViewController.m | 8 ++++---- 3 files changed, 5 insertions(+), 18 deletions(-) diff --git a/QiniuDemo/Podfile b/QiniuDemo/Podfile index cd8782dc..c07d4f2a 100755 --- a/QiniuDemo/Podfile +++ b/QiniuDemo/Podfile @@ -4,7 +4,7 @@ target "QiniuDemo" do platform :ios, "10.0" # pod 'Qiniu', '~> 7.4.0' -# pod 'Qiniu', '7.1.7' +# pod 'Qiniu', '8.8.0' pod 'Qiniu',:path => '../' pod 'HappyDNS',:path => '../../happy-dns-objc' pod 'TZImagePickerController', '~> 3.8.7' diff --git a/QiniuDemo/QiniuDemo.xcodeproj/project.pbxproj b/QiniuDemo/QiniuDemo.xcodeproj/project.pbxproj index 213ee64d..ed818924 100644 --- a/QiniuDemo/QiniuDemo.xcodeproj/project.pbxproj +++ b/QiniuDemo/QiniuDemo.xcodeproj/project.pbxproj @@ -10,7 +10,6 @@ 26F62ADDD5B6306E978C9A3F /* libPods-QiniuDemoTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 14CB2139715DD7B6FD5B146E /* libPods-QiniuDemoTests.a */; }; 45169DF22C3D263200737759 /* Uploader.m in Sources */ = {isa = PBXBuildFile; fileRef = 45169DF12C3D263200737759 /* Uploader.m */; }; 4561F02C28D9A6F80098A697 /* UploadResource_14M.zip in Resources */ = {isa = PBXBuildFile; fileRef = 4561F02B28D9A6F80098A697 /* UploadResource_14M.zip */; }; - 45E6080929ADD57100634200 /* UploadResource_1G.zip in Resources */ = {isa = PBXBuildFile; fileRef = 45E6080829ADD57100634200 /* UploadResource_1G.zip */; }; 93D230241C86D7F700434F6D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D230231C86D7F700434F6D /* main.m */; }; 93D230271C86D7F700434F6D /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D230261C86D7F700434F6D /* AppDelegate.m */; }; 93D2302A1C86D7F700434F6D /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D230291C86D7F700434F6D /* ViewController.m */; }; @@ -47,7 +46,6 @@ 45169DF12C3D263200737759 /* Uploader.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Uploader.m; sourceTree = ""; }; 4561F02B28D9A6F80098A697 /* UploadResource_14M.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = UploadResource_14M.zip; sourceTree = ""; }; 4561F02F28D9AB090098A697 /* Configure.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Configure.h; sourceTree = ""; }; - 45E6080829ADD57100634200 /* UploadResource_1G.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = UploadResource_1G.zip; sourceTree = ""; }; 6B9BC5A8D93F988C1240E05F /* libPods-QiniuDemo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-QiniuDemo.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 93D2301F1C86D7F700434F6D /* QiniuDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = QiniuDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 93D230231C86D7F700434F6D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; @@ -97,18 +95,9 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 37C097D5D636357AA82067EF /* Resources */ = { - isa = PBXGroup; - children = ( - ); - name = Resources; - path = QiniuDemo/Resources; - sourceTree = ""; - }; 4561F02A28D9A6F80098A697 /* DemoResource */ = { isa = PBXGroup; children = ( - 45E6080829ADD57100634200 /* UploadResource_1G.zip */, 4561F02B28D9A6F80098A697 /* UploadResource_14M.zip */, 4561F02F28D9AB090098A697 /* Configure.h */, ); @@ -144,7 +133,6 @@ 93D230201C86D7F700434F6D /* Products */, 63D8EA8E5532E578D972E007 /* Pods */, 7E4EA7693FD8983C455E9490 /* Frameworks */, - 37C097D5D636357AA82067EF /* Resources */, ); sourceTree = ""; }; @@ -312,7 +300,6 @@ buildActionMask = 2147483647; files = ( 93D230321C86D7F700434F6D /* LaunchScreen.storyboard in Resources */, - 45E6080929ADD57100634200 /* UploadResource_1G.zip in Resources */, 4561F02C28D9A6F80098A697 /* UploadResource_14M.zip in Resources */, 93D2302F1C86D7F700434F6D /* Assets.xcassets in Resources */, 93D2302D1C86D7F700434F6D /* Main.storyboard in Resources */, diff --git a/QiniuDemo/QiniuDemo/ViewController.m b/QiniuDemo/QiniuDemo/ViewController.m index b0e61272..461190f8 100755 --- a/QiniuDemo/QiniuDemo/ViewController.m +++ b/QiniuDemo/QiniuDemo/ViewController.m @@ -23,7 +23,7 @@ typedef NS_ENUM(NSInteger, UploadState){ UploadStateUploading, UploadStateCancelling }; -@interface DnsItem : NSObject +@interface DnsItem : NSObject @property(nonatomic, copy)NSString *hostValue; @property(nonatomic, copy)NSString *ipValue; @property(nonatomic, strong)NSNumber *ttlValue; @@ -33,7 +33,7 @@ @interface DnsItem : NSObject +@interface ViewController () @property (nonatomic, weak) IBOutlet UIButton* chooseBtn; @property (nonatomic, weak) IBOutlet UIButton* uploadBtn; @@ -144,7 +144,7 @@ - (void)uploadImageToQNFilePath:(NSString *)filePath complete:(dispatch_block_t) self.token = @"5cJEzNSnh3PjOHZR_E0u1HCkXw4Bw1ZSuWQI9ufz:-ul1AJ8Fvpc7WhtpVT91Pvdfreo=:eyJzY29wZSI6InpvbmUwLXNwYWNlIiwiZGVhZGxpbmUiOjM0MzM3NDYyNTl9"; - QNConfiguration *configuration = [QNConfiguration build:^(QNConfigurationBuilder *builder) { + QNConfiguration *configuration = [QNConfiguration buildV2:^(QNConfigurationBuilder *builder) { builder.timeoutInterval = 90; builder.retryMax = 1; // builder.useHttps = NO; @@ -255,7 +255,7 @@ - (PHAsset *)getPHAssert { option.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]]; __block PHAsset *phAsset = nil; - PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionSubtypeAny subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]; + PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]; for (PHAssetCollection *collection in smartAlbums) { // 有可能是PHCollectionList类的的对象,过滤掉 if (![collection isKindOfClass:[PHAssetCollection class]]) continue;