全部产品
Search
文档中心

对象存储 OSS:iOS快速入门

更新时间:Sep 06, 2024

本文介绍如何快速使用OSS iOS SDK完成常见操作,例如创建存储空间(Bucket)、上传文件(Object)、下载文件等。

前提条件

已安装iOS SDK。具体操作,请参见安装

示例工程

您可以通过查看以下示例工程,了解如何上传创建存储空间、本地文件、下载文件等操作:

示例工程用法如下:

  • 克隆工程:通过 git clone 获取示例工程

  • 配置参数。

  • 启动本地 STS 鉴权服务。

    • 根据工程sts_local_server目录中本地鉴权服务脚本文件启动本地STS鉴权服务器,配置其中的AccessKeyId、AccessKeySecret以及RoleArn参数信息。

    • 通过Python启动本机HTTP服务httpserver.py,以便在客户端代码中访问本地服务获取StsToken.AccessKeyId、StsToken.SecretKey和StsToken.SecurityToken。

运行工程IOS demo得到如下: fig_ios_phpnedemo

示例代码

以下演示了在iOS平台以及Mac平台上传和下载文件的流程。

  1. 导入OSS软件包

    在使用OSS服务前,请先导入所需的头文件。

    #import <AliyunOSSiOS/OSSService.h>                            
  1. 初始化OSSClient

    1. 授权访问

      OSS支持三种鉴权方式:明文设置、自签名模式、STS鉴权模式。建议移动端使用STS鉴权模式,详细配置说明请参见STS鉴权模式

      1. 获取临时访问凭证

        1. 明文设置:直接使用AccessKeyId和AccessKeySecret进行鉴权。

        2. 自签名模式:生成签名字符串进行鉴权,请参见自签名模式

        3. STS鉴权模式:使用临时安全凭证进行鉴权。调用STS服务的AssumeRole接口或使用各语言STS SDK来获取临时访问凭证,请参见使用STS临时访问凭证访问OSS

      2. 使用临时访问凭证初始化SDK。

    2. 以下是一个在完整应用程序生命周期中初始化 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实例与应用程序的生命周期一致。

  2. 创建存储空间

    以下代码用于创建名为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阻塞等待其完成。

  3. 上传文件

    以下代码用于将本地文件上传到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];
  4. 下载指定文件

    以下代码用于下载指定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];