Skip to content

Commit

Permalink
Merge pull request #387 from YangSen-qn/develop
Browse files Browse the repository at this point in the history
add fog cn east 1 & handle some cf code
  • Loading branch information
Mei-Zhao authored Apr 14, 2021
2 parents ab024e2 + 38556d2 commit d9046b7
Show file tree
Hide file tree
Showing 12 changed files with 207 additions and 17 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
#Changelog
## 8.2.1(2021-04-01)
## 增加
- 增加雾存储 [FixedZone zoneFogCnEast1]
- 优化日志统计

## 8.2.0(2021-02-20)
## 增加
- 增加网络监控功能,选择最优Host进行上传
Expand Down
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.2.0'
s.version = '8.2.1'
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
4 changes: 2 additions & 2 deletions QiniuDemo/QiniuDemo/ViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ - (IBAction)uploadAction:(UIButton *)sender {
if (self.uploadState == UploadStatePrepare) {

#ifdef YourToken
NSString *path = [[NSBundle mainBundle] pathForResource:@"UploadResource.dmg" ofType:nil];
// NSString *path = [[NSBundle mainBundle] pathForResource:@"UploadResource_49M.zip" ofType:nil];
// NSString *path = [[NSBundle mainBundle] pathForResource:@"UploadResource.dmg" ofType:nil];
NSString *path = [[NSBundle mainBundle] pathForResource:@"UploadResource_49M.zip" ofType:nil];
[self uploadImageToQNFilePath:path];
[self changeUploadState:UploadStateUploading];
#else
Expand Down
2 changes: 1 addition & 1 deletion QiniuSDK/Collect/QNReportItem.m
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ - (NSString *)requestReportErrorType{
errorType = @"parse_error";
} else if (self.statusCode == -1007 || self.statusCode == -1010 || self.statusCode == kQNMaliciousResponseError){
errorType = @"malicious_response";
} else if (self.statusCode > -1130 && self.statusCode <= -1100){
} else if (self.statusCode == kQNUnexpectedSysCallError || (self.statusCode > -1130 && self.statusCode <= -1100)){
errorType = @"unexpected_syscall_error";
} else if (self.statusCode == kQNRequestCancelled
|| self.statusCode == NSURLErrorCancelled){
Expand Down
15 changes: 14 additions & 1 deletion QiniuSDK/Common/QNFixedZone.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,22 @@ NS_ASSUME_NONNULL_BEGIN
* zone As0 新加坡
*
* @return 实例
*/
*/
+ (instancetype)zoneAs0;

/**
* zone fog-cn-east-1 雾存储 华东-1
* 分片上传暂时仅支持分片 api v2
* 分片 api v2设置方式:配置 QNConfiguration 的 resumeUploadVersion 为 QNResumeUploadVersionV2
* eg:
* QNConfiguration *configuration = [QNConfiguration build:^(QNConfigurationBuilder *builder) {
* builder.resumeUploadVersion = QNResumeUploadVersionV2;
* }];
*
* @return 实例
*/
+ (instancetype)zoneFogCnEast1;

/**
* Zone初始化方法
*
Expand Down
13 changes: 13 additions & 0 deletions QiniuSDK/Common/QNFixedZone.m
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,19 @@ + (instancetype)zoneAs0 {
return zAs0;
}

+ (instancetype)zoneFogCnEast1 {
static QNFixedZone *zFogCnEast1 = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
zFogCnEast1 = [[QNFixedZone alloc] initWithUpDomainList:@[@"upload-fog-cn-east-1.qiniup.com",
@"up-fog-cn-east-1.qiniup.com"]
oldUpList:@[@"upload-fog-cn-east-1.qiniup.com",
@"up-fog-cn-east-1.qiniup.com"]
regionId:@"fog-cn-east-1"];;
});
return zFogCnEast1;
}

+ (QNFixedZone *)localsZoneInfo{

NSArray *zones = @[[QNFixedZone zone0],
Expand Down
157 changes: 156 additions & 1 deletion QiniuSDK/Http/Request/HttpClient/UrlProtocol/QNCFHttpClient.m
Original file line number Diff line number Diff line change
Expand Up @@ -612,7 +612,162 @@ - (NSError *)translateCFNetworkErrorIntoUrlError:(NSError *)cfError{
break;
case EQFULL: /* Interface output queue is full */
break;

case -9800: /* SSL protocol error */
errorCode = NSURLErrorSecureConnectionFailed;
break;
case -9801: /* Cipher Suite negotiation failure */
errorCode = NSURLErrorSecureConnectionFailed;
break;
case -9802: /* Fatal alert */
errorCode = kQNUnexpectedSysCallError;
break;
case -9803: /* I/O would block (not fatal) */
errorCode = kQNUnexpectedSysCallError;
break;
case -9804: /* attempt to restore an unknown session */
errorCode = kQNUnexpectedSysCallError;
break;
case -9805: /* connection closed gracefully */
errorCode = NSURLErrorNetworkConnectionLost;
break;
case -9806: /* connection closed via error */
errorCode = NSURLErrorNetworkConnectionLost;
break;
case -9807: /* invalid certificate chain */
errorCode = NSURLErrorServerCertificateNotYetValid;
break;
case -9808: /* bad certificate format */
errorCode = NSURLErrorServerCertificateNotYetValid;
break;
case -9809: /* underlying cryptographic error */
errorCode = NSURLErrorSecureConnectionFailed;
break;
case -9810: /* Internal error */
errorCode = NSURLErrorNotConnectedToInternet;
break;
case -9811: /* module attach failure */
errorCode = kQNUnexpectedSysCallError;
break;
case -9812: /* valid cert chain, untrusted root */
errorCode = NSURLErrorServerCertificateHasUnknownRoot;
break;
case -9813: /* cert chain not verified by root */
errorCode = NSURLErrorServerCertificateHasUnknownRoot;
break;
case -9814: /* chain had an expired cert */
errorCode = NSURLErrorServerCertificateHasBadDate;
break;
case -9815: /* chain had a cert not yet valid */
errorCode = NSURLErrorServerCertificateNotYetValid;
break;
case -9816: /* server closed session with no notification */
errorCode = NSURLErrorNetworkConnectionLost;
break;
case -9817: /* insufficient buffer provided */
errorCode = NSURLErrorCannotDecodeRawData;
break;
case -9818: /* bad SSLCipherSuite */
errorCode = NSURLErrorClientCertificateRejected;
break;
case -9819: /* unexpected message received */
errorCode = NSURLErrorNotConnectedToInternet;
break;
case -9820: /* bad MAC */
errorCode = NSURLErrorNotConnectedToInternet;
break;
case -9821: /* decryption failed */
errorCode = NSURLErrorNotConnectedToInternet;
break;
case -9822: /* record overflow */
errorCode = NSURLErrorDataLengthExceedsMaximum;
break;
case -9823: /* decompression failure */
errorCode = NSURLErrorDownloadDecodingFailedMidStream;
break;
case -9824: /* handshake failure */
errorCode = NSURLErrorClientCertificateRejected;
break;
case -9825: /* misc. bad certificate */
errorCode = NSURLErrorServerCertificateNotYetValid;
break;
case -9826: /* bad unsupported cert format */
errorCode = NSURLErrorServerCertificateNotYetValid;
break;
case -9827: /* certificate revoked */
errorCode = NSURLErrorServerCertificateNotYetValid;
break;
case -9828: /* certificate expired */
errorCode = NSURLErrorServerCertificateNotYetValid;
break;
case -9829: /* unknown certificate */
errorCode = NSURLErrorServerCertificateNotYetValid;
break;
case -9830: /* illegal parameter */
errorCode = NSURLErrorCannotDecodeRawData;
break;
case -9831: /* unknown Cert Authority */
errorCode = NSURLErrorServerCertificateNotYetValid;
break;
case -9832: /* access denied */
errorCode = NSURLErrorClientCertificateRejected;
break;
case -9833: /* decoding error */
errorCode = NSURLErrorServerCertificateNotYetValid;
break;
case -9834: /* decryption error */
errorCode = NSURLErrorCannotDecodeRawData;
break;
case -9835: /* export restriction */
errorCode = NSURLErrorCannotConnectToHost;
break;
case -9836: /* bad protocol version */
errorCode = NSURLErrorCannotConnectToHost;
break;
case -9837: /* insufficient security */
errorCode = NSURLErrorClientCertificateRejected;
break;
case -9838: /* internal error */
errorCode = NSURLErrorTimedOut;
break;
case -9839: /* user canceled */
errorCode = NSURLErrorCancelled;
break;
case -9840: /* no renegotiation allowed */
errorCode = NSURLErrorCannotConnectToHost;
break;
case -9841: /* peer cert is valid, or was ignored if verification disabled */
errorCode = NSURLErrorServerCertificateNotYetValid;
break;
case -9842: /* server has requested a client cert */
errorCode = NSURLErrorClientCertificateRejected;
break;
case -9843: /* peer host name mismatch */
errorCode = NSURLErrorNotConnectedToInternet;
break;
case -9844: /* peer dropped connection before responding */
errorCode = NSURLErrorNetworkConnectionLost;
break;
case -9845: /* decryption failure */
errorCode = NSURLErrorCannotDecodeRawData;
break;
case -9846: /* bad MAC */
errorCode = NSURLErrorNotConnectedToInternet;
break;
case -9847: /* record overflow */
errorCode = NSURLErrorDataLengthExceedsMaximum;
break;
case -9848: /* configuration error */
errorCode = kQNUnexpectedSysCallError;
break;
case -9849: /* unexpected (skipped) record in DTLS */
errorCode = kQNUnexpectedSysCallError;
break;
case -9850: /* weak ephemeral dh key */
errorCode = kQNUnexpectedSysCallError;
break;
case -9851: /* SNI */
errorCode = NSURLErrorClientCertificateRejected;
break;
default:
break;
}
Expand Down
4 changes: 2 additions & 2 deletions QiniuSDK/Storage/QNUploadManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ - (void)putFileInternal:(id<QNFileDelegate>)file
option:option
configuration:self.config
recorder:self.config.recorder
recorderKey:key
recorderKey:recorderKey
completionHandler:complete];
QNAsyncRun(^{
[up run];
Expand All @@ -231,7 +231,7 @@ - (void)putFileInternal:(id<QNFileDelegate>)file
option:option
configuration:self.config
recorder:self.config.recorder
recorderKey:key
recorderKey:recorderKey
completionHandler:complete];
QNAsyncRun(^{
[up run];
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.2.0";
static NSString *const kQiniuVersion = @"8.2.1";
4 changes: 3 additions & 1 deletion QiniuSDKTests/QNFileRecorderTest.m
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@ - (void)setUp {
NSError *error = nil;
QNFileRecorder *file = [QNFileRecorder fileRecorderWithFolder:[NSTemporaryDirectory() stringByAppendingString:@"qiniutest"] error:&error];
NSLog(@"recorder error %@", error);
_upManager = [[QNUploadManager alloc] initWithRecorder:file];
_upManager = [[QNUploadManager alloc] initWithRecorder:file recorderKeyGenerator:^NSString *(NSString *uploadKey, NSString *filePath) {
return [NSString stringWithFormat:@"Qiniu:%@", uploadKey];
}];
#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED
NSString *travis = [[NSProcessInfo processInfo] environment][@"QINIU_TEST_ENV"];
if ([travis isEqualToString:@"travis"]) {
Expand Down
14 changes: 8 additions & 6 deletions QiniuSDKTests/QNTestConfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,15 @@
#import <Foundation/Foundation.h>

// 华东上传凭证
static NSString *const token_z0 = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:P2TpDQhLhYuwN5oyJxHNB7vJo5Q=:eyJzY29wZSI6ImtvZG8tcGhvbmUtem9uZTAtc3BhY2UiLCJkZWFkbGluZSI6MTYxNzQ0MTY3MSwgInJldHVybkJvZHkiOiJ7XCJjYWxsYmFja1VybFwiOlwiaHR0cDpcL1wvY2FsbGJhY2suZGV2LnFpbml1LmlvXCIsIFwiZm9vXCI6JCh4OmZvbyksIFwiYmFyXCI6JCh4OmJhciksIFwibWltZVR5cGVcIjokKG1pbWVUeXBlKSwgXCJoYXNoXCI6JChldGFnKSwgXCJrZXlcIjokKGtleSksIFwiZm5hbWVcIjokKGZuYW1lKX0ifQ==";
static NSString *const token_z0 = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:x4wpUQZIiekDShX8QPaw38Jl-pA=:eyJzY29wZSI6ImtvZG8tcGhvbmUtem9uZTAtc3BhY2UiLCJkZWFkbGluZSI6MTYyMzE0NDA5NSwgInJldHVybkJvZHkiOiJ7XCJjYWxsYmFja1VybFwiOlwiaHR0cDpcL1wvY2FsbGJhY2suZGV2LnFpbml1LmlvXCIsIFwiZm9vXCI6JCh4OmZvbyksIFwiYmFyXCI6JCh4OmJhciksIFwibWltZVR5cGVcIjokKG1pbWVUeXBlKSwgXCJoYXNoXCI6JChldGFnKSwgXCJrZXlcIjokKGtleSksIFwiZm5hbWVcIjokKGZuYW1lKX0ifQ==";
// 华北上传凭证
static NSString *const token_z1 = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:_kBlqVP5GHJpaUPABY4wXX8qEyM=:eyJzY29wZSI6ImtvZG8tcGhvbmUtem9uZTEtc3BhY2UiLCJkZWFkbGluZSI6MTYxNzQ0MTY3MSwgInJldHVybkJvZHkiOiJ7XCJjYWxsYmFja1VybFwiOlwiaHR0cDpcL1wvY2FsbGJhY2suZGV2LnFpbml1LmlvXCIsIFwiZm9vXCI6JCh4OmZvbyksIFwiYmFyXCI6JCh4OmJhciksIFwibWltZVR5cGVcIjokKG1pbWVUeXBlKSwgXCJoYXNoXCI6JChldGFnKSwgXCJrZXlcIjokKGtleSksIFwiZm5hbWVcIjokKGZuYW1lKX0ifQ==";
static NSString *const token_z1 = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:QTJ8NJjarobRS_lhXbXFG_3Nt1M=:eyJzY29wZSI6ImtvZG8tcGhvbmUtem9uZTEtc3BhY2UiLCJkZWFkbGluZSI6MTYyMzE0NDA5NSwgInJldHVybkJvZHkiOiJ7XCJjYWxsYmFja1VybFwiOlwiaHR0cDpcL1wvY2FsbGJhY2suZGV2LnFpbml1LmlvXCIsIFwiZm9vXCI6JCh4OmZvbyksIFwiYmFyXCI6JCh4OmJhciksIFwibWltZVR5cGVcIjokKG1pbWVUeXBlKSwgXCJoYXNoXCI6JChldGFnKSwgXCJrZXlcIjokKGtleSksIFwiZm5hbWVcIjokKGZuYW1lKX0ifQ==";
// 华南上传凭证
static NSString *const token_z2 = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:FHbBBT0aZMySq9yW2HL5cWvgKY0=:eyJzY29wZSI6ImtvZG8tcGhvbmUtem9uZTItc3BhY2UiLCJkZWFkbGluZSI6MTYxNzQ0MTY3MSwgInJldHVybkJvZHkiOiJ7XCJjYWxsYmFja1VybFwiOlwiaHR0cDpcL1wvY2FsbGJhY2suZGV2LnFpbml1LmlvXCIsIFwiZm9vXCI6JCh4OmZvbyksIFwiYmFyXCI6JCh4OmJhciksIFwibWltZVR5cGVcIjokKG1pbWVUeXBlKSwgXCJoYXNoXCI6JChldGFnKSwgXCJrZXlcIjokKGtleSksIFwiZm5hbWVcIjokKGZuYW1lKX0ifQ==";
static NSString *const token_z2 = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:c0JNSuCEiLYquzVsjao5FDOCPIQ=:eyJzY29wZSI6ImtvZG8tcGhvbmUtem9uZTItc3BhY2UiLCJkZWFkbGluZSI6MTYyMzE0NDA5NSwgInJldHVybkJvZHkiOiJ7XCJjYWxsYmFja1VybFwiOlwiaHR0cDpcL1wvY2FsbGJhY2suZGV2LnFpbml1LmlvXCIsIFwiZm9vXCI6JCh4OmZvbyksIFwiYmFyXCI6JCh4OmJhciksIFwibWltZVR5cGVcIjokKG1pbWVUeXBlKSwgXCJoYXNoXCI6JChldGFnKSwgXCJrZXlcIjokKGtleSksIFwiZm5hbWVcIjokKGZuYW1lKX0ifQ==";
// 北美上传凭证
static NSString *const token_na0 = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:afZ52QS3DcskWmslFZ_DzJfdvGo=:eyJzY29wZSI6ImtvZG8tcGhvbmUtem9uZS1uYTAtc3BhY2UiLCJkZWFkbGluZSI6MTYxNzQ0MTY3MSwgInJldHVybkJvZHkiOiJ7XCJjYWxsYmFja1VybFwiOlwiaHR0cDpcL1wvY2FsbGJhY2suZGV2LnFpbml1LmlvXCIsIFwiZm9vXCI6JCh4OmZvbyksIFwiYmFyXCI6JCh4OmJhciksIFwibWltZVR5cGVcIjokKG1pbWVUeXBlKSwgXCJoYXNoXCI6JChldGFnKSwgXCJrZXlcIjokKGtleSksIFwiZm5hbWVcIjokKGZuYW1lKX0ifQ==";
static NSString *const token_na0 = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:CE_x-t-0SfoP57HO8JBnmuRGRVI=:eyJzY29wZSI6ImtvZG8tcGhvbmUtem9uZS1uYTAtc3BhY2UiLCJkZWFkbGluZSI6MTYyMzE0NDA5NSwgInJldHVybkJvZHkiOiJ7XCJjYWxsYmFja1VybFwiOlwiaHR0cDpcL1wvY2FsbGJhY2suZGV2LnFpbml1LmlvXCIsIFwiZm9vXCI6JCh4OmZvbyksIFwiYmFyXCI6JCh4OmJhciksIFwibWltZVR5cGVcIjokKG1pbWVUeXBlKSwgXCJoYXNoXCI6JChldGFnKSwgXCJrZXlcIjokKGtleSksIFwiZm5hbWVcIjokKGZuYW1lKX0ifQ==";
// 东南亚上传凭证
static NSString *const token_as0 = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:bOwt7TCEVRgW4qScKxvyLEXi-3g=:eyJzY29wZSI6ImtvZG8tcGhvbmUtem9uZS1hczAtc3BhY2UiLCJkZWFkbGluZSI6MTYxNzQ0MTY3MSwgInJldHVybkJvZHkiOiJ7XCJjYWxsYmFja1VybFwiOlwiaHR0cDpcL1wvY2FsbGJhY2suZGV2LnFpbml1LmlvXCIsIFwiZm9vXCI6JCh4OmZvbyksIFwiYmFyXCI6JCh4OmJhciksIFwibWltZVR5cGVcIjokKG1pbWVUeXBlKSwgXCJoYXNoXCI6JChldGFnKSwgXCJrZXlcIjokKGtleSksIFwiZm5hbWVcIjokKGZuYW1lKX0ifQ==";
static NSString *const invalidBucketToken = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:4kDPxbq_NS-30bI9ojECkrNNCjw=:eyJzY29wZSI6InpvbmVfaW52YWxpZCIsImRlYWRsaW5lIjoxNjE3NDQxNjcxLCAicmV0dXJuQm9keSI6IntcImNhbGxiYWNrVXJsXCI6XCJodHRwOlwvXC9jYWxsYmFjay5kZXYucWluaXUuaW9cIiwgXCJmb29cIjokKHg6Zm9vKSwgXCJiYXJcIjokKHg6YmFyKSwgXCJtaW1lVHlwZVwiOiQobWltZVR5cGUpLCBcImhhc2hcIjokKGV0YWcpLCBcImtleVwiOiQoa2V5KSwgXCJmbmFtZVwiOiQoZm5hbWUpfSJ9";
static NSString *const token_as0 = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:8tvliBec0pOddZs_yBQN5CdgJy4=:eyJzY29wZSI6ImtvZG8tcGhvbmUtem9uZS1hczAtc3BhY2UiLCJkZWFkbGluZSI6MTYyMzE0NDA5NSwgInJldHVybkJvZHkiOiJ7XCJjYWxsYmFja1VybFwiOlwiaHR0cDpcL1wvY2FsbGJhY2suZGV2LnFpbml1LmlvXCIsIFwiZm9vXCI6JCh4OmZvbyksIFwiYmFyXCI6JCh4OmJhciksIFwibWltZVR5cGVcIjokKG1pbWVUeXBlKSwgXCJoYXNoXCI6JChldGFnKSwgXCJrZXlcIjokKGtleSksIFwiZm5hbWVcIjokKGZuYW1lKX0ifQ==";
// 雾存储华东一区
static NSString *const token_fog_cn_east1 = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:SoMCokhtUwqn65phVAELedMxJYk=:eyJzY29wZSI6InRlc3QtZm9nLWNuLWVhc3QtMSIsImRlYWRsaW5lIjoxNjIzMTQ0MDk1LCAicmV0dXJuQm9keSI6IntcImNhbGxiYWNrVXJsXCI6XCJodHRwOlwvXC9jYWxsYmFjay5kZXYucWluaXUuaW9cIiwgXCJmb29cIjokKHg6Zm9vKSwgXCJiYXJcIjokKHg6YmFyKSwgXCJtaW1lVHlwZVwiOiQobWltZVR5cGUpLCBcImhhc2hcIjokKGV0YWcpLCBcImtleVwiOiQoa2V5KSwgXCJmbmFtZVwiOiQoZm5hbWUpfSJ9";
static NSString *const invalidBucketToken = @"dxVQk8gyk3WswArbNhdKIwmwibJ9nFsQhMNUmtIM:dAJ-hJvGDqs36D4Uv2IQUVBQ1rc=:eyJzY29wZSI6InpvbmVfaW52YWxpZCIsImRlYWRsaW5lIjoxNjIzMTQ0MDk1LCAicmV0dXJuQm9keSI6IntcImNhbGxiYWNrVXJsXCI6XCJodHRwOlwvXC9jYWxsYmFjay5kZXYucWluaXUuaW9cIiwgXCJmb29cIjokKHg6Zm9vKSwgXCJiYXJcIjokKHg6YmFyKSwgXCJtaW1lVHlwZVwiOiQobWltZVR5cGUpLCBcImhhc2hcIjokKGV0YWcpLCBcImtleVwiOiQoa2V5KSwgXCJmbmFtZVwiOiQoZm5hbWUpfSJ9";
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
通过 CocoaPods

```ruby
pod "Qiniu", "~> 8.2.0"
pod "Qiniu", "~> 8.2.1"
```

## 运行环境
Expand Down

0 comments on commit d9046b7

Please sign in to comment.