Skip to content

Commit cee42e7

Browse files
Merge pull request #6 from volcengine/release2main
Release2main
2 parents 1d33cf9 + 3050700 commit cee42e7

File tree

18 files changed

+936
-85
lines changed

18 files changed

+936
-85
lines changed

CHANGELOG.md

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,46 @@
11
# ChangeLog of TOS SDK for iOS
22

3-
## 版本号:v2.1.0 日期:2022-11-21
3+
## 版本号:v2.1.6 日期:2024-09-14
44

55
### 变更内容
66

7-
* 第一次正式发布
7+
* 分片支持流式上传
88

9-
## 版本号:v2.1.1 日期:2023-06-25
9+
10+
## 版本号:v2.1.5 日期:2024-08-29
1011

1112
### 变更内容
1213

13-
* fix concurrent bug
14+
* 流式上传
1415

15-
## 版本号:v2.1.2 日期:2023-09-13
16+
## 版本号:v2.1.4 日期:2023-11-30
1617

1718
### 变更内容
1819

19-
* 支持数据处理参数 tosProcess
20+
* PutObject、CompleteMultipartUpload支持回调函数
2021

2122
## 版本号:v2.1.3 日期:2023-10-25
2223

2324
### 变更内容
2425

2526
* 支持数据处理转存参数 tosProcessSaveAsObject & tosProcessSaveAsBucket
2627
* 上传、下载进度条
28+
29+
30+
## 版本号:v2.1.2 日期:2023-09-13
31+
32+
### 变更内容
33+
34+
* 支持数据处理参数 tosProcess
35+
36+
## 版本号:v2.1.1 日期:2023-06-25
37+
38+
### 变更内容
39+
40+
* fix concurrent bug
41+
42+
## 版本号:v2.1.0 日期:2022-11-21
43+
44+
### 变更内容
45+
46+
* 第一次正式发布

VeTOSiOSSDK-Example/VeTOSiOSSDK-Example.xcodeproj/project.pbxproj

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010
2B18A48B28BFCAC8009DC909 /* image.png in Resources */ = {isa = PBXBuildFile; fileRef = 2B18A48A28BFCAC8009DC909 /* image.png */; };
1111
2B27064629271BF400275903 /* TOSUploadFileTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B27064529271BF400275903 /* TOSUploadFileTests.m */; };
1212
2B52524828ABC9FC00FC1B99 /* TOSObjectTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B52524728ABC9FC00FC1B99 /* TOSObjectTests.m */; };
13-
2B67AE012AE7E8B2001D1AAB /* VeTOSiOSSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B67AE002AE7E8B2001D1AAB /* VeTOSiOSSDK.framework */; };
14-
2B67AE022AE7E8B2001D1AAB /* VeTOSiOSSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 2B67AE002AE7E8B2001D1AAB /* VeTOSiOSSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
1513
2B67AE042AE804DA001D1AAB /* example.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 2B67AE032AE804DA001D1AAB /* example.jpg */; };
1614
2B67AE062AE823CE001D1AAB /* TOSUtilityTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B67AE052AE823CE001D1AAB /* TOSUtilityTests.m */; };
1715
2B67AE0C2AE8B8A0001D1AAB /* test.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = 2B67AE0B2AE8B8A0001D1AAB /* test.mp4 */; };
@@ -28,6 +26,9 @@
2826
2BAF44D028AB96D0009CF7BF /* TOSBucketTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BAF44CF28AB96D0009CF7BF /* TOSBucketTests.m */; };
2927
2BAF44D528AB99FB009CF7BF /* TOSTestUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BAF44D428AB99FB009CF7BF /* TOSTestUtil.m */; };
3028
2BAF754B2A47496000E297C4 /* file.zero in Resources */ = {isa = PBXBuildFile; fileRef = 2BAF754A2A47496000E297C4 /* file.zero */; };
29+
2BCDE35D2C7EFD19007AEDBD /* TOSPutStreamTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BCDE35C2C7EFD19007AEDBD /* TOSPutStreamTests.m */; };
30+
2BCDE35F2C7F00D5007AEDBD /* VeTOSiOSSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2BCDE35E2C7F00D5007AEDBD /* VeTOSiOSSDK.framework */; };
31+
2BCDE3602C7F00D5007AEDBD /* VeTOSiOSSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 2BCDE35E2C7F00D5007AEDBD /* VeTOSiOSSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
3132
/* End PBXBuildFile section */
3233

3334
/* Begin PBXContainerItemProxy section */
@@ -61,7 +62,7 @@
6162
dstPath = "";
6263
dstSubfolderSpec = 10;
6364
files = (
64-
2B67AE022AE7E8B2001D1AAB /* VeTOSiOSSDK.framework in Embed Frameworks */,
65+
2BCDE3602C7F00D5007AEDBD /* VeTOSiOSSDK.framework in Embed Frameworks */,
6566
);
6667
name = "Embed Frameworks";
6768
runOnlyForDeploymentPostprocessing = 0;
@@ -73,7 +74,6 @@
7374
2B27064529271BF400275903 /* TOSUploadFileTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TOSUploadFileTests.m; sourceTree = "<group>"; };
7475
2B52524628ABC83600FC1B99 /* TOSTestConstants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TOSTestConstants.h; sourceTree = "<group>"; };
7576
2B52524728ABC9FC00FC1B99 /* TOSObjectTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TOSObjectTests.m; sourceTree = "<group>"; };
76-
2B67AE002AE7E8B2001D1AAB /* VeTOSiOSSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = VeTOSiOSSDK.framework; sourceTree = BUILT_PRODUCTS_DIR; };
7777
2B67AE032AE804DA001D1AAB /* example.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = example.jpg; sourceTree = "<group>"; };
7878
2B67AE052AE823CE001D1AAB /* TOSUtilityTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TOSUtilityTests.m; sourceTree = "<group>"; };
7979
2B67AE0B2AE8B8A0001D1AAB /* test.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = test.mp4; sourceTree = "<group>"; };
@@ -99,14 +99,16 @@
9999
2BAF44D328AB99FB009CF7BF /* TOSTestUtil.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TOSTestUtil.h; sourceTree = "<group>"; };
100100
2BAF44D428AB99FB009CF7BF /* TOSTestUtil.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TOSTestUtil.m; sourceTree = "<group>"; };
101101
2BAF754A2A47496000E297C4 /* file.zero */ = {isa = PBXFileReference; lastKnownFileType = text; path = file.zero; sourceTree = "<group>"; };
102+
2BCDE35C2C7EFD19007AEDBD /* TOSPutStreamTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TOSPutStreamTests.m; sourceTree = "<group>"; };
103+
2BCDE35E2C7F00D5007AEDBD /* VeTOSiOSSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = VeTOSiOSSDK.framework; sourceTree = BUILT_PRODUCTS_DIR; };
102104
/* End PBXFileReference section */
103105

104106
/* Begin PBXFrameworksBuildPhase section */
105107
2BA05A5D287D1EB400C470CA /* Frameworks */ = {
106108
isa = PBXFrameworksBuildPhase;
107109
buildActionMask = 2147483647;
108110
files = (
109-
2B67AE012AE7E8B2001D1AAB /* VeTOSiOSSDK.framework in Frameworks */,
111+
2BCDE35F2C7F00D5007AEDBD /* VeTOSiOSSDK.framework in Frameworks */,
110112
);
111113
runOnlyForDeploymentPostprocessing = 0;
112114
};
@@ -188,7 +190,7 @@
188190
2BA05B0B287D242C00C470CA /* Frameworks */ = {
189191
isa = PBXGroup;
190192
children = (
191-
2B67AE002AE7E8B2001D1AAB /* VeTOSiOSSDK.framework */,
193+
2BCDE35E2C7F00D5007AEDBD /* VeTOSiOSSDK.framework */,
192194
);
193195
name = Frameworks;
194196
sourceTree = "<group>";
@@ -206,6 +208,7 @@
206208
2B99F9A628AE584B00899C42 /* PreSignTests.m */,
207209
2B27064529271BF400275903 /* TOSUploadFileTests.m */,
208210
2B67AE052AE823CE001D1AAB /* TOSUtilityTests.m */,
211+
2BCDE35C2C7EFD19007AEDBD /* TOSPutStreamTests.m */,
209212
);
210213
path = VeTOSiOSSDKTests;
211214
sourceTree = "<group>";
@@ -402,6 +405,7 @@
402405
files = (
403406
2BAF44D028AB96D0009CF7BF /* TOSBucketTests.m in Sources */,
404407
2B67AE062AE823CE001D1AAB /* TOSUtilityTests.m in Sources */,
408+
2BCDE35D2C7EFD19007AEDBD /* TOSPutStreamTests.m in Sources */,
405409
2B99F9A328ADF89100899C42 /* TOSMultipartTests.m in Sources */,
406410
2B99F9A728AE584B00899C42 /* PreSignTests.m in Sources */,
407411
2BAF44D528AB99FB009CF7BF /* TOSTestUtil.m in Sources */,
@@ -687,6 +691,7 @@
687691
isa = XCBuildConfiguration;
688692
buildSettings = {
689693
BUNDLE_LOADER = "$(TEST_HOST)";
694+
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
690695
CODE_SIGN_STYLE = Automatic;
691696
CURRENT_PROJECT_VERSION = 1;
692697
GENERATE_INFOPLIST_FILE = YES;
@@ -704,6 +709,7 @@
704709
isa = XCBuildConfiguration;
705710
buildSettings = {
706711
BUNDLE_LOADER = "$(TEST_HOST)";
712+
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
707713
CODE_SIGN_STYLE = Automatic;
708714
CURRENT_PROJECT_VERSION = 1;
709715
GENERATE_INFOPLIST_FILE = YES;

VeTOSiOSSDK-Example/VeTOSiOSSDKTests/TOSBucketTests.m

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ - (void)testAPI_createBucket01 {
7070
XCTAssertTrue([t.result isKindOfClass:[TOSHeadBucketOutput class]]);
7171
TOSHeadBucketOutput *headOutput = t.result;
7272
XCTAssertEqual(200, headOutput.tosStatusCode);
73-
NSLog(@"=====> %@", headOutput.tosRegion);
7473
XCTAssertTrue([TOS_REGION isEqualToString:headOutput.tosRegion]);
7574
XCTAssertTrue([TOSStorageClassStandard isEqualToString:headOutput.tosStorageClass]);
7675
return nil;

VeTOSiOSSDK-Example/VeTOSiOSSDKTests/TOSMultipartTests.m

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,4 +493,104 @@ - (void)testAPI_listMultipartUploadsFromNonexistentBucket {
493493
XCTAssertNil(task.result);
494494
}
495495

496+
- (void)testAPI_multipartUploadsCallback {
497+
TOSTask *task = nil;
498+
// 1. 创建分段上传任务
499+
TOSCreateMultipartUploadInput *createInput = [TOSCreateMultipartUploadInput new];
500+
createInput.tosBucket = TOS_BUCKET;
501+
createInput.tosKey = [NSString stringWithFormat:@"multipart-callback"];
502+
task = [_client createMultipartUpload:createInput];
503+
[task waitUntilFinished];
504+
505+
XCTAssertNil(task.error);
506+
XCTAssertNotNil(task.result);
507+
TOSCreateMultipartUploadOutput *createOutput = task.result;
508+
XCTAssertEqual(200, createOutput.tosStatusCode);
509+
510+
// 2. 开始上传
511+
const int partSize = 3;
512+
NSMutableArray *parts = [NSMutableArray array];
513+
for (int i = 1; i <= partSize; i++) {
514+
TOSUploadPartInput *upload = [TOSUploadPartInput new];
515+
upload.tosKey = createOutput.tosKey;
516+
upload.tosBucket = createOutput.tosBucket;
517+
upload.tosUploadID = createOutput.tosUploadID;
518+
upload.tosPartNumber = i;
519+
upload.tosContent = [NSData dataWithContentsOfFile:_filePath];
520+
task = [_client uploadPart:upload];
521+
[task waitUntilFinished];
522+
523+
XCTAssertNil(task.error);
524+
XCTAssertNotNil(task.result);
525+
TOSUploadPartOutput *upOutput = task.result;
526+
527+
NSString *mString = upOutput.tosETag;
528+
mString = [mString stringByReplacingOccurrencesOfString:@"\"" withString:@""];
529+
upOutput.tosETag = mString;
530+
531+
TOSUploadedPart *uploadedPart = [TOSUploadedPart new];
532+
uploadedPart.tosETag = mString;
533+
uploadedPart.tosPartNumber = upOutput.tosPartNumber;
534+
535+
XCTAssertEqual(200, upOutput.tosStatusCode);
536+
[parts addObject:upOutput];
537+
}
538+
XCTAssertEqual(partSize, [parts count]);
539+
540+
// 3. 合并分段
541+
TOSCompleteMultipartUploadInput *complete = [TOSCompleteMultipartUploadInput new];
542+
complete.tosBucket = createOutput.tosBucket;
543+
complete.tosKey = createOutput.tosKey;
544+
complete.tosUploadID = createOutput.tosUploadID;
545+
546+
NSMutableDictionary *dictCallback = [[NSMutableDictionary alloc] init];
547+
[dictCallback setValue:TOS_CALLBACK_URL forKey:@"callbackUrl"];
548+
[dictCallback setValue:@"{\"bucket\": ${bucket}, \"object\": ${object}, \"key1\": ${x:key1}}" forKey:@"callbackBody"];
549+
[dictCallback setValue:@"application/json" forKey:@"callbackBodyType"];
550+
551+
552+
553+
NSMutableDictionary *dictCallbackVar = [[NSMutableDictionary alloc] init];
554+
[dictCallbackVar setValue:@"ceshi" forKey:@"x:key1"];
555+
556+
NSString *callbackStr = [TOSUtil base64StringFromDictionary:dictCallback];
557+
NSString *callbackVarStr = [TOSUtil base64StringFromDictionary:dictCallbackVar];
558+
559+
complete.tosCallback = callbackStr;
560+
complete.tosCallbackVar = callbackVarStr;
561+
562+
NSMutableArray *comArray = [NSMutableArray array];
563+
for (TOSUploadPartOutput *p in parts) {
564+
TOSUploadedPart *comPart = [TOSUploadedPart new];
565+
comPart.tosPartNumber = p.tosPartNumber;
566+
comPart.tosETag = p.tosETag;
567+
[comArray addObject:comPart];
568+
}
569+
XCTAssertEqual(partSize, [comArray count]);
570+
complete.tosParts = comArray;
571+
task = [_client completeMultipartUpload:complete];
572+
[task waitUntilFinished];
573+
XCTAssertNil(task.error);
574+
XCTAssertNotNil(task.result);
575+
TOSCompleteMultipartUploadOutput *comOutput = task.result;
576+
XCTAssertLessThanOrEqual(200, comOutput.tosStatusCode);
577+
XCTAssertNotNil(comOutput.tosLocation);
578+
XCTAssertNotNil(comOutput.tosETag);
579+
XCTAssertNotNil(comOutput.tosCallbackResult);
580+
XCTAssertTrue([comOutput.tosCallbackResult containsString:@"ok"]);
581+
NSLog(@"===>%@", comOutput.tosCallbackResult);
582+
583+
584+
// 4. HeadObject检查属性
585+
TOSHeadObjectInput *headInput = [TOSHeadObjectInput new];
586+
headInput.tosBucket = createInput.tosBucket;
587+
headInput.tosKey = createInput.tosKey;
588+
task = [_client headObject:headInput];
589+
[task waitUntilFinished];
590+
XCTAssertNil(task.error);
591+
XCTAssertNotNil(task.result);
592+
TOSHeadObjectOutput *headOutput = task.result;
593+
XCTAssertEqual(headOutput.tosVersionID, comOutput.tosVersionID);
594+
}
595+
496596
@end

VeTOSiOSSDK-Example/VeTOSiOSSDKTests/TOSObjectTests.m

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,40 @@ - (void)testAPI_ObjectNameCharacterSet06 {
408408
}] waitUntilFinished];
409409
}
410410

411+
- (void)testAPI_putObjectCallBack {
412+
TOSPutObjectInput *putInput = [TOSPutObjectInput new];
413+
putInput.tosBucket = _privateBucket;
414+
putInput.tosKey = @"hello";
415+
putInput.tosContent = [@"hello world." dataUsingEncoding:kCFStringEncodingUTF8];
416+
417+
NSMutableDictionary *dictCallback = [[NSMutableDictionary alloc] init];
418+
[dictCallback setValue:TOS_CALLBACK_URL forKey:@"callbackUrl"];
419+
[dictCallback setValue:@"{\"bucket\": ${bucket}, \"object\": ${object}, \"key1\": ${x:key1}}" forKey:@"callbackBody"];
420+
[dictCallback setValue:@"application/json" forKey:@"callbackBodyType"];
421+
422+
NSMutableDictionary *dictCallbackVar = [[NSMutableDictionary alloc] init];
423+
[dictCallbackVar setValue:@"ceshi" forKey:@"x:key1"];
424+
425+
NSString *callbackStr = [TOSUtil base64StringFromDictionary:dictCallback];
426+
NSString *callbackVarStr = [TOSUtil base64StringFromDictionary:dictCallbackVar];
427+
428+
putInput.tosCallback = callbackStr;
429+
putInput.tosCallbackVar = callbackVarStr;
430+
431+
TOSTask *task = [_client putObject:putInput];
432+
[[task continueWithBlock:^id _Nullable(TOSTask * _Nonnull t) {
433+
XCTAssertNil(t.error);
434+
XCTAssertNotNil(t.result);
435+
XCTAssertTrue([t.result isKindOfClass:[TOSPutObjectOutput class]]);
436+
TOSPutObjectOutput *putOutput = t.result;
437+
XCTAssertEqual(200, putOutput.tosStatusCode);
438+
XCTAssertNotNil(putOutput.tosCallbackResult);
439+
XCTAssertTrue([putOutput.tosCallbackResult containsString:@"ok"]);
440+
return nil;
441+
}] waitUntilFinished];
442+
443+
}
444+
411445
// Object Test
412446
// 1. 上传对象不包含可选参数
413447
- (void)testAPI_putObject01 {

0 commit comments

Comments
 (0)