本文介绍如何使用iOS SDK完成上传、下载文件等基础操作。

背景信息

关于iOS SDK的更多信息,请参见如下示例:

您还可以直接git clone工程,并配置如下必要的参数,例如OSS_ACCESSKEY_IDOSS_SECRETKEY_ID等。

ios

运行工程demo如下:

fig_ios_phpnedemo

示例代码

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

  1. 需要添加的引用
    #import <AliyunOSSiOS/OSSService.h>
  2. 初始化OSSClient

    初始化OSSClient时需要完成Endpoint设置、鉴权方式设置和Client参数设置。其中鉴权方式包含明文设置模式、自签名模式以及STS鉴权模式。如果需要使用STS鉴权模式,请参见授权访问

    完善脚本文件中的AccessKeyId、SecretKeyId以及RoleArn参数信息。通过Python启动本机HTTP服务。在客户端代码中访问本地服务以获取StsToken.AccessKeyId、StsToken.SecretKeyId以及StsToken.SecurityToken。

    说明

    搭建STS服务的具体操作请参见开发指南中的使用STS临时访问凭证访问OSS。您可以通过调用STS服务的AssumeRole接口或者使用各语言STS SDK来获取临时访问凭证。临时访问凭证包括临时访问密钥(AccessKey ID和AccessKey Secret)和安全令牌(SecurityToken)。

    NSString *endpoint = @"https://oss-cn-hangzhou.aliyuncs.com";
    
    // 移动端建议使用STS方式初始化OSSClient。
    id<OSSCredentialProvider> credential = [[OSSFederationCredentialProvider alloc] initWithFederationTokenGetter:^OSSFederationToken * _Nullable{
        OSSFederationToken *token = [OSSFederationToken new];
        // 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
        token.tAccessKey = @"AccessKeyId";
        token.tSecretKey = @"AccessKeySecret";
        // 从STS服务获取的安全令牌(SecurityToken)。
        token.tToken = @"SecurityToken";
        // 临时访问凭证的过期时间。
        token.expirationTimeInGMTFormat = @"Expiration";
        return token;
    }];
    
    client = [[OSSClient alloc] initWithEndpoint:endpoint credentialProvider:credential];

    您可以通过OSSClient发起多线程的上传和下载请求,并发执行多个任务。

  3. 上传文件

    如果在OSS控制台有已创建的Bucket。SDK的所有操作都会返回OSSTask,您可以为OSSTask设置延续动作,等待其异步完成,也可以通过调用waitUntilFinished阻塞等待其完成。

    OSSPutObjectRequest * put = [OSSPutObjectRequest new];
    // 填写Bucket名称,例如examplebucket。
    put.bucketName = @"examplebucket";
    // 填写Object完整路径。Object完整路径中不能包含Bucket名称,例如exampledir/testdir/exampleobject.txt。
    put.objectKey = @"exampledir/testdir/exampleobject.txt";
    // 直接上传NSData。
    put.uploadingData = <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. 下载指定文件

    以下代码用于下载指定Object为NSData

    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];