- 云币
- 270
- 威望
- 90
- 最后登录
- 2018-3-9
- 积分
- 90
- 注册时间
- 2018-1-3
- 帖子
- 2

- 云币
- 270
- 威望
- 90
|
目前COS支持了通过Path-Style的方式来访问,所以使用Path-Style的Amazon iOS SDK也可以在COS上面使用了。
1. Amazon iOS S3 SDK 地址
Github地址 https://github.com/aws/aws-sdk-ios
2. 一小步适配工作
使用 AWS iOS SDK 向 COS 发出的例如 Put Bucket Life Cycle 的请求是没有包含Content-MD5这个Header的,所以需要通过插件的
方式加进去。在这里我们可以Hook签名的方法,在最后把这个Header加进去。简单地讲,就是在项目里创建AWSSignatureV4Signer+ExtraSignatureSteps.h 和 AWSSignatureV4Signer+ExtraSignatureSteps.m 这两个文件,并且将下面的代码粘贴到对应的文件里即可。
AWSSignatureV4Signer+ExtraSignatureSteps.h :- //
- // AWSSignatureV4Signer+ExtraSignatureSteps.h
- // S3TransferManagerSample
- //
- //
- // Copyright © 2017 Amazon Web Services. All rights reserved.
- //
- #import <AWSCore/AWSCore.h>
- @interface AWSSignatureV4Signer (ExtraSignatureSteps)
- @end
复制代码 AWSSignatureV4Signer+ExtraSignatureSteps.m:- //
- // AWSSignatureV4Signer+ExtraSignatureSteps.m
- // S3TransferManagerSample
- //
- //
- // Copyright © 2017 Amazon Web Services. All rights reserved.
- //
- #import "AWSSignatureV4Signer+ExtraSignatureSteps.h"
- #import <objc/runtime.h>
- @implementation AWSSignatureV4Signer (ExtraSignatureSteps)
- + (void)load {
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- Class class = [self class];
-
- SEL originalSelector = @selector(signRequestV4:credentials:);
- SEL swizzledSelector = @selector(swizzle_signRequestV4:credentails:);
-
- Method originalMethod = class_getInstanceMethod(class, originalSelector);
- Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
-
-
- BOOL didAddMethod =
- class_addMethod(class,
- originalSelector,
- method_getImplementation(swizzledMethod),
- method_getTypeEncoding(swizzledMethod));
-
- if (didAddMethod) {
- class_replaceMethod(class,
- swizzledSelector,
- method_getImplementation(originalMethod),
- method_getTypeEncoding(originalMethod));
- } else {
- method_exchangeImplementations(originalMethod, swizzledMethod);
- }
- });
- }
- - (NSString*)swizzle_signRequestV4:(NSMutableURLRequest*)request credentails:(AWSCredentials*)credentials {
- NSString* authentication = [self swizzle_signRequestV4:request credentails:credentials];
-
- //added by eric
- if (([ request.HTTPMethod i**alToString:@"PUT"] && ([[[request URL] query] hasPrefix:@"tagging"] ||
- [[[request URL] query] hasPrefix:@"lifecycle"] ||
- [[[request URL] query] hasPrefix:@"cors"]))
- || ([request.HTTPMethod i**alToString:@"POST"] && [[[request URL] query] hasPrefix:@"delete"])
- ) {
- if (![request valueForHTTPHeaderField:@"Content-MD5"]) {
- [request setValue:[NSString aws_base64md5FromData:request.HTTPBody] forHTTPHeaderField:@"Content-MD5"];
- }
- }
- //add end
- return authentication;
-
- }
- @end
复制代码 然后完成,就可以直接使用AWS iOS SDK的所有功能了。
3. 使用指南
因为是向COS发请求,所以要在初始化时候配置为COS的域名。下面演示了一段初始化的过程,可以参照代码和注释来进行操作。- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
- {
-
- //以Region为ap-guangzhou为例,那么域名就是cos.ap-guangzhou.myqcloud.com。
- //如果使用的是其它的region,那么对应的域名就是cos.<region>.myqcloud.com, <region>指的是具体的地域名称,例如ap-beijing等等
- NSURL* bucketURL = [NSURL URLWithString:@"http://cos.ap-guangzhou.myqcloud.com"];
-
- AWSEndpoint* endpoint = [[AWSEndpoint alloc] initWithRegion:AWSRegionUnknown service:AWSServiceS3 URL:bucketURL];
- //设置Secret ID与Secret Key
- //如果使用的是临时签名的话,可以生成一个[[AWSBasicSessionCredentialsProvider alloc] initWithAccessKey:@"临时的Secret ID" secretKey:@"临时的SecretKey" sessionToken:@"临时密钥的token"]
- self.credentialProvider = [[AWSStaticCredentialsProvider alloc] initWithAccessKey:@"填入COS的Secret ID" secretKey:@"填入COS的Secret Key"];
-
- //这里的Region其实无所谓,可以随便选一个
- AWSServiceConfiguration* configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionCNNorth1 endpoint:endpoint credentialsProvider:self.credentialProvider];
-
- [[AWSServiceManager defaultServiceManager] setDefaultServiceConfiguration:configuration];
- return YES;
- }
复制代码 还有一点需要注意的是,在使用AWS接口的时候,Bucket需要填 <name>-<Appid>的形式,例如 test-123456789 ,才可以正常访问。
剩下的就可以直接按照AWS的文档来操作了,COS是兼容的。
|
|