欢迎您来到腾讯云!积分商城

腾讯云腾讯云论坛

 找回密码
 立即注册
忘了密码?

扫一扫,访问微社区

快捷导航
搜索
查看: 165|回复: 0

[经验分享] COS 兼容 aws-sdk-ios 指南

[复制链接]

1

主题

0

好友

90

积分

小白[LV1]

Rank: 1

云币
270
威望
90
发表于 2018-2-26 10:18:45 |显示全部楼层 |未分类
目前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 :
  1. //
  2. //  AWSSignatureV4Signer+ExtraSignatureSteps.h
  3. //  S3TransferManagerSample
  4. //
  5. //  
  6. //  Copyright © 2017 Amazon Web Services. All rights reserved.
  7. //

  8. #import <AWSCore/AWSCore.h>

  9. @interface AWSSignatureV4Signer (ExtraSignatureSteps)

  10. @end
复制代码
AWSSignatureV4Signer+ExtraSignatureSteps.m:
  1. //
  2. //  AWSSignatureV4Signer+ExtraSignatureSteps.m
  3. //  S3TransferManagerSample
  4. //
  5. //  
  6. //  Copyright © 2017 Amazon Web Services. All rights reserved.
  7. //

  8. #import "AWSSignatureV4Signer+ExtraSignatureSteps.h"
  9. #import <objc/runtime.h>
  10. @implementation AWSSignatureV4Signer (ExtraSignatureSteps)
  11. + (void)load {
  12.     static dispatch_once_t onceToken;
  13.     dispatch_once(&onceToken, ^{
  14.         Class class = [self class];
  15.         
  16.         SEL originalSelector = @selector(signRequestV4:credentials:);
  17.         SEL swizzledSelector = @selector(swizzle_signRequestV4:credentails:);
  18.         
  19.         Method originalMethod = class_getInstanceMethod(class, originalSelector);
  20.         Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
  21.         

  22.         
  23.         BOOL didAddMethod =
  24.         class_addMethod(class,
  25.                         originalSelector,
  26.                         method_getImplementation(swizzledMethod),
  27.                         method_getTypeEncoding(swizzledMethod));
  28.         
  29.         if (didAddMethod) {
  30.             class_replaceMethod(class,
  31.                                 swizzledSelector,
  32.                                 method_getImplementation(originalMethod),
  33.                                 method_getTypeEncoding(originalMethod));
  34.         } else {
  35.             method_exchangeImplementations(originalMethod, swizzledMethod);
  36.         }
  37.     });
  38. }


  39. - (NSString*)swizzle_signRequestV4:(NSMutableURLRequest*)request credentails:(AWSCredentials*)credentials {
  40.     NSString* authentication = [self swizzle_signRequestV4:request credentails:credentials];
  41.    
  42.     //added by eric
  43.     if (([ request.HTTPMethod i**alToString:@"PUT"] && ([[[request URL] query] hasPrefix:@"tagging"] ||
  44.                                                           [[[request URL] query] hasPrefix:@"lifecycle"] ||
  45.                                                           [[[request URL] query] hasPrefix:@"cors"]))
  46.         || ([request.HTTPMethod i**alToString:@"POST"] && [[[request URL] query] hasPrefix:@"delete"])
  47.         ) {
  48.         if (![request valueForHTTPHeaderField:@"Content-MD5"]) {
  49.             [request setValue:[NSString aws_base64md5FromData:request.HTTPBody] forHTTPHeaderField:@"Content-MD5"];
  50.         }
  51.     }
  52.     //add end
  53.     return authentication;
  54.    
  55. }
  56. @end
复制代码
然后完成,就可以直接使用AWS iOS SDK的所有功能了。

3. 使用指南

因为是向COS发请求,所以要在初始化时候配置为COS的域名。下面演示了一段初始化的过程,可以参照代码和注释来进行操作。
  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  2. {
  3.    
  4. //以Region为ap-guangzhou为例,那么域名就是cos.ap-guangzhou.myqcloud.com。
  5. //如果使用的是其它的region,那么对应的域名就是cos.<region>.myqcloud.com, <region>指的是具体的地域名称,例如ap-beijing等等
  6.     NSURL* bucketURL = [NSURL URLWithString:@"http://cos.ap-guangzhou.myqcloud.com"];
  7.    
  8.     AWSEndpoint* endpoint = [[AWSEndpoint alloc] initWithRegion:AWSRegionUnknown service:AWSServiceS3 URL:bucketURL];

  9. //设置Secret ID与Secret Key
  10. //如果使用的是临时签名的话,可以生成一个[[AWSBasicSessionCredentialsProvider alloc] initWithAccessKey:@"临时的Secret ID" secretKey:@"临时的SecretKey" sessionToken:@"临时密钥的token"]


  11.     self.credentialProvider = [[AWSStaticCredentialsProvider alloc] initWithAccessKey:@"填入COS的Secret ID" secretKey:@"填入COS的Secret Key"];

  12.    
  13. //这里的Region其实无所谓,可以随便选一个
  14.     AWSServiceConfiguration* configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionCNNorth1 endpoint:endpoint credentialsProvider:self.credentialProvider];
  15.         
  16.     [[AWSServiceManager defaultServiceManager] setDefaultServiceConfiguration:configuration];
  17.     return YES;
  18. }
复制代码
还有一点需要注意的是,在使用AWS接口的时候,Bucket需要填 <name>-<Appid>的形式,例如 test-123456789 ,才可以正常访问。

剩下的就可以直接按照AWS的文档来操作了,COS是兼容的。







您需要登录后才可以回帖 登录 | 立即注册
您需要登录后才可以发帖 QQ登录

联系我们|腾讯云平台|积分商城|腾讯云官方论坛    

GMT+8, 2018-4-21 17:49 , Processed in 1.172086 second(s), 29 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部