本文介绍如何快速使用OSS iOS SDK完成常见操作,例如创建存储空间(Bucket)、上传文件(Object)、下载文件等。
前提条件
已安装iOS SDK。具体操作,请参见安装。
示例工程
您可以通过查看以下示例工程,了解如何上传创建存储空间、本地文件、下载文件等操作:
示例工程用法如下:
克隆工程:通过 git clone 获取示例工程。
配置参数。
运行AliyunOSSSwift实例前,您需要在OSSSwiftGlobalDefines.swift文件中配置必要参数。
运行AliyunOSSSDK前,您需要在OSSTestMacros.h文件中配置必要参数。
启动本地 STS 鉴权服务。
根据工程sts_local_server目录中本地鉴权服务脚本文件启动本地STS鉴权服务器,配置其中的AccessKeyId、AccessKeySecret以及RoleArn参数信息。
通过Python启动本机HTTP服务httpserver.py,以便在客户端代码中访问本地服务获取StsToken.AccessKeyId、StsToken.SecretKey和StsToken.SecurityToken。
运行工程IOS demo得到如下:
示例代码
以下演示了在iOS平台以及Mac平台上传和下载文件的流程。
导入OSS软件包
在使用OSS服务前,请先导入所需的头文件。
#import <AliyunOSSiOS/OSSService.h>
初始化OSSClient
授权访问
OSS支持三种鉴权方式:明文设置、自签名模式、STS鉴权模式。建议移动端使用STS鉴权模式,详细配置说明请参见STS鉴权模式。
获取临时访问凭证
明文设置:直接使用AccessKeyId和AccessKeySecret进行鉴权。
自签名模式:生成签名字符串进行鉴权,请参见自签名模式。
STS鉴权模式:使用临时安全凭证进行鉴权。调用STS服务的AssumeRole接口或使用各语言STS SDK来获取临时访问凭证,请参见使用STS临时访问凭证访问OSS。
使用临时访问凭证初始化SDK。
以下是一个在完整应用程序生命周期中初始化 OSSClient 的示例代码:
@interface AppDelegate () @property (nonatomic, strong) OSSClient *client; @end /** * 获取sts信息的url,配置在业务方自己的搭建的服务器上。 */ #define OSS_STS_URL @"oss_sts_url" /** * bucket所在的region的endpoint。 */ #define OSS_ENDPOINT @"your bucket's endpoint" @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. // 初始化OSSClient实例 [self setupOSSClient]; return YES; } - (void)setupOSSClient { // 初始化具有自动刷新的provider id<OSSCredentialProvider> credentialProvider = [[OSSAuthCredentialProvider alloc] initWithAuthServerUrl:OSS_STS_URL]; // client端的配置,如超时时间,开启dns解析等等 OSSClientConfiguration *cfg = [[OSSClientConfiguration alloc] init]; client = [[OSSClient alloc] initWithEndpoint:OSS_ENDPOINT credentialProvider:credentialProvider clientConfiguration:cfg]; }
说明如果您的应用只用到一个访问域名和数据中心下的bucket,建议保持OSSClient实例与应用程序的生命周期一致。
创建存储空间
以下代码用于创建名为examplebucket的存储空间。
// 构建创建Bucket的请求。 OSSCreateBucketRequest * create = [OSSCreateBucketRequest new]; // 设置存储空间名称为examplebucket。 create.bucketName = @"examplebucket"; // 设置访问权限为私有。 create.xOssACL = @"private"; // 设置存储类型为低频访问类型IA。 create.storageClass = OSSBucketStorageClassIA; OSSTask * createTask = [client createBucket:create]; [createTask continueWithBlock:^id(OSSTask *task) { if (!task.error) { NSLog(@"create bucket success!"); } else { NSLog(@"create bucket failed, error: %@", task.error); } return nil; }]; // 实现阻塞等待任务完成。 // [createTask waitUntilFinished];
说明SDK的所有操作都会返回
OSSTask
,您可以为OSSTask
设置延续动作,等待其异步完成,也可以通过调用waitUntilFinished
阻塞等待其完成。上传文件
以下代码用于将本地文件上传到OSS。
OSSPutObjectRequest * put = [OSSPutObjectRequest new]; // 填写Bucket名称,例如examplebucket。 put.bucketName = @"examplebucket"; // 填写Object完整路径。Object完整路径中不能包含Bucket名称,例如exampledir/testdir/exampleobject.txt。 put.objectKey = @"exampledir/testdir/exampleobject.txt"; put.uploadingFileURL = [NSURL fileURLWithPath:@"<filePath>"]; // put.uploadingData = <NSData *>; // 直接上传NSData。 // 直接上传NSData。 put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend); }; OSSTask * putTask = [client putObject:put]; [putTask continueWithBlock:^id(OSSTask *task) { if (!task.error) { NSLog(@"upload object success!"); } else { NSLog(@"upload object failed, error: %@" , task.error); } return nil; }]; // 实现阻塞等待任务完成。 // [putTask waitUntilFinished];
下载指定文件
以下代码用于下载指定OSS文件到本地文件。
OSSGetObjectRequest * request = [OSSGetObjectRequest new]; // 填写Bucket名称,例如examplebucket。 request.bucketName = @"examplebucket"; // 填写Object完整路径。Object完整路径中不能包含Bucket名称,例如exampledir/testdir/exampleobject.txt。 request.objectKey = @"exampledir/testdir/exampleobject.txt"; request.downloadProgress = ^(int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite) { NSLog(@"%lld, %lld, %lld", bytesWritten, totalBytesWritten, totalBytesExpectedToWrite); }; OSSTask * getTask = [client getObject:request]; [getTask continueWithBlock:^id(OSSTask *task) { if (!task.error) { NSLog(@"download object success!"); OSSGetObjectResult * getResult = task.result; NSLog(@"download result: %@", getResult.downloadedData); } else { NSLog(@"download object failed, error: %@" ,task.error); } return nil; }]; // 实现阻塞等待任务完成。 // [task waitUntilFinished];