Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
#Changelog
## 8.9.0 (2025-06-12)
- 分片上传默认使用 V2 接口

## 8.8.1(2024-10-25)
- 处理 iOS 18 PHAssetResource 信息 fetch 失败而导致异常问题

Expand Down
1 change: 1 addition & 0 deletions Qiniu
Submodule Qiniu added at 9873e0
2 changes: 1 addition & 1 deletion Qiniu.podspec
Original file line number Diff line number Diff line change
@@ -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'
Expand Down
2 changes: 1 addition & 1 deletion QiniuDemo/Podfile
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down
13 changes: 0 additions & 13 deletions QiniuDemo/QiniuDemo.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -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 */; };
Expand Down Expand Up @@ -47,7 +46,6 @@
45169DF12C3D263200737759 /* Uploader.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Uploader.m; sourceTree = "<group>"; };
4561F02B28D9A6F80098A697 /* UploadResource_14M.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = UploadResource_14M.zip; sourceTree = "<group>"; };
4561F02F28D9AB090098A697 /* Configure.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Configure.h; sourceTree = "<group>"; };
45E6080829ADD57100634200 /* UploadResource_1G.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = UploadResource_1G.zip; sourceTree = "<group>"; };
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 = "<group>"; };
Expand Down Expand Up @@ -97,18 +95,9 @@
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
37C097D5D636357AA82067EF /* Resources */ = {
isa = PBXGroup;
children = (
);
name = Resources;
path = QiniuDemo/Resources;
sourceTree = "<group>";
};
4561F02A28D9A6F80098A697 /* DemoResource */ = {
isa = PBXGroup;
children = (
45E6080829ADD57100634200 /* UploadResource_1G.zip */,
4561F02B28D9A6F80098A697 /* UploadResource_14M.zip */,
4561F02F28D9AB090098A697 /* Configure.h */,
);
Expand Down Expand Up @@ -144,7 +133,6 @@
93D230201C86D7F700434F6D /* Products */,
63D8EA8E5532E578D972E007 /* Pods */,
7E4EA7693FD8983C455E9490 /* Frameworks */,
37C097D5D636357AA82067EF /* Resources */,
);
sourceTree = "<group>";
};
Expand Down Expand Up @@ -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 */,
Expand Down
8 changes: 4 additions & 4 deletions QiniuDemo/QiniuDemo/ViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ typedef NS_ENUM(NSInteger, UploadState){
UploadStateUploading,
UploadStateCancelling
};
@interface DnsItem : NSObject <QNIDnsNetworkAddress,TZImagePickerControllerDelegate>
@interface DnsItem : NSObject <QNIDnsNetworkAddress>
@property(nonatomic, copy)NSString *hostValue;
@property(nonatomic, copy)NSString *ipValue;
@property(nonatomic, strong)NSNumber *ttlValue;
Expand All @@ -33,7 +33,7 @@ @interface DnsItem : NSObject <QNIDnsNetworkAddress,TZImagePickerControllerDeleg
@implementation DnsItem
@end

@interface ViewController () <UINavigationControllerDelegate, UIImagePickerControllerDelegate, QNDnsDelegate>
@interface ViewController () <UINavigationControllerDelegate, UIImagePickerControllerDelegate, TZImagePickerControllerDelegate>

@property (nonatomic, weak) IBOutlet UIButton* chooseBtn;
@property (nonatomic, weak) IBOutlet UIButton* uploadBtn;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions QiniuSDK.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -637,6 +637,7 @@
4551E55E24CE81DA00447285 /* QNInetAddress.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = QNInetAddress.m; sourceTree = "<group>"; };
4551E56524D0065100447285 /* NSData+QNMD5.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSData+QNMD5.h"; sourceTree = "<group>"; };
4551E56624D0065100447285 /* NSData+QNMD5.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSData+QNMD5.m"; sourceTree = "<group>"; };
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 = "<group>"; };
45CBC6D02ABA9FFF00962B47 /* QNCache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = QNCache.h; sourceTree = "<group>"; };
45CBC6D12ABA9FFF00962B47 /* QNCache.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = QNCache.m; sourceTree = "<group>"; };
Expand Down Expand Up @@ -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 */,
Expand Down
11 changes: 10 additions & 1 deletion QiniuSDK/Collect/QNUploadInfoReporter.m
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand Down
21 changes: 19 additions & 2 deletions QiniuSDK/Storage/QNConfiguration.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#import <Foundation/Foundation.h>
#import "QNRecorderDelegate.h"
#import "QNDns.h"
#import "QNDefine.h"

/**
* 断点上传时的分块大小
Expand Down Expand Up @@ -133,13 +134,29 @@ 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
* 分片V2上传更快效率更高
*
* @param block 配置block
*/
+ (instancetype)buildV2:(QNConfigurationBuilderBlock)block;

@end

Expand Down
76 changes: 48 additions & 28 deletions QiniuSDK/Storage/QNConfiguration.m
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,67 @@
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{
QNConfigurationBuilder *builder = [[QNConfigurationBuilder alloc] init];
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;
Expand Down Expand Up @@ -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

7 changes: 4 additions & 3 deletions QiniuSDK/Storage/QNUploadManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#import <Foundation/Foundation.h>

#import "QNRecorderDelegate.h"
#import "QNDefine.h"

@class QNResponseInfo;
@class QNUploadOption;
Expand Down Expand Up @@ -39,7 +40,7 @@ typedef void (^QNUpCompletionHandler)(QNResponseInfo *info, NSString *key, NSDic
*
* @return 上传管理类实例
*/
- (instancetype)init;
- (instancetype)init kQNDeprecated("use initWithConfiguration instead");

/**
* 使用一个持久化的记录接口进行记录的构造方法
Expand All @@ -48,7 +49,7 @@ typedef void (^QNUpCompletionHandler)(QNResponseInfo *info, NSString *key, NSDic
*
* @return 上传管理类实例
*/
- (instancetype)initWithRecorder:(id<QNRecorderDelegate>)recorder;
- (instancetype)initWithRecorder:(id<QNRecorderDelegate>)recorder kQNDeprecated("use initWithConfiguration instead");

/**
* 使用持久化记录接口以及持久化key生成函数的构造方法,默认情况下使用上传存储的key, 如果key为nil或者有特殊字符比如/,建议使用自己的生成函数
Expand All @@ -59,7 +60,7 @@ typedef void (^QNUpCompletionHandler)(QNResponseInfo *info, NSString *key, NSDic
* @return 上传管理类实例
*/
- (instancetype)initWithRecorder:(id<QNRecorderDelegate>)recorder
recorderKeyGenerator:(QNRecorderKeyGenerator)recorderKeyGenerator;
recorderKeyGenerator:(QNRecorderKeyGenerator)recorderKeyGenerator kQNDeprecated("use initWithConfiguration instead");

/**
* 使用配置信息生成上传实例
Expand Down
2 changes: 1 addition & 1 deletion QiniuSDK/Utils/QNVersion.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,4 @@
/**
* sdk 版本
*/
static NSString *const kQiniuVersion = @"8.8.1";
static NSString *const kQiniuVersion = @"8.9.0";
4 changes: 2 additions & 2 deletions QiniuSDKTests/QNCFHttpClientTest.m
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,15 @@ - (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";

[self request:request];
}

- (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";

Expand Down
7 changes: 7 additions & 0 deletions QiniuSDKTests/QNConfigurationTest.m
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
4 changes: 2 additions & 2 deletions QiniuSDKTests/QNResumeUploadTest.m
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down
Loading
Loading