このトピックでは、OSS SDK for iOS を使用してオブジェクトをアップロードおよびダウンロードする方法について説明します。
前提条件
開始する前に、次のことを確認してください。
OSS SDK for iOS がインストール済みであること。 詳細については、「インストール (iOS SDK)」をご参照ください。
デモプロジェクト
次のデモプロジェクトでは、バケットの作成、ローカルファイルのアップロード、オブジェクトのダウンロード方法を説明します。
デモプロジェクトを実行するには:
git cloneを使用して デモプロジェクト をクローンします。-
必要なパラメーターを設定します。
AliyunOSSSwift デモの場合は、OSSSwiftGlobalDefines.swift でパラメーターを設定します。
AliyunOSSSDK デモの場合は、OSSTestMacros.h でパラメーターを設定します。
-
Security Token Service (STS) を起動します。
sts_local_serverディレクトリから 認証スクリプト を実行してローカル STS 認証サーバーを起動し、AccessKeyId、AccessKeySecret、RoleArnパラメーターを設定します。httpserver.py を使用してローカル HTTP サービスを起動します。 クライアントは、このローカル HTTP サービスから
StsToken.AccessKeyId、StsToken.SecretKey、StsToken.SecurityTokenの値を取得します。
iOS デモを起動すると、アプリには画像選択 ([Select])、カスタム署名付きアップロード ([CustomSign])、アップロード ([Put])、ダウンロード ([Get])、サムネイル取得 ([GetResizeImage])、テキストウォーターマーク ([Watermark])、アップロードコールバック ([triggerCallback]) のエントリーポイントが用意されています。
サンプルコード
以下の手順では、iOS および macOS でオブジェクトをアップロードおよびダウンロードする方法を説明します。
-
OSS パッケージをインポートします。
OSS API を呼び出す前に、必要なヘッダーファイルをインポートします。
#import <AliyunOSSiOS/OSSService.h>
-
OSSClient インスタンスを 初期化 します。
-
認証モードを選択します。
OSS SDK for iOS は、プレーンテキスト、自己署名、STS 認証の 3 つの認証モードをサポートしています。 モバイルアプリでは、STS 認証の使用を推奨します。STS 認証は、キーが漏洩した場合のリスクを軽減する有効期間の短い認証情報を発行し、アプリを更新することなくローテーションできます。 AccessKey ID と AccessKey Secret をアプリのバイナリにハードコーディングすると、バイナリがリバースエンジニアリングされた場合にアカウントが漏洩するリスクがあり、新しいバージョンをリリースせずに認証情報をローテーションすることもできなくなります。
詳細については、「STS 認証モード」をご参照ください。
-
認証情報を取得します。
プレーンテキストモードでは、AccessKey ID と AccessKey Secret を直接使用して認証します。
自己署名モードでは、署名文字列を生成して認証します。 詳細については、「自己署名モード」をご参照ください。
STS 認証モードでは、Security Token Service (STS) によって発行された一時的なアクセス認証情報を使用します。 AssumeRole API を呼び出すか、STS SDK を使用して一時的な認証情報を取得します。 詳細については、「STS の一時的な認証情報を使用した OSS へのアクセス」をご参照ください。
認証情報を使用して OSS SDK for iOS を初期化します。
-
-
次のコードは、アプリケーションのライフサイクル全体で利用する OSSClient インスタンスを初期化します。
OSSAuthCredentialProviderは、STS 認証情報が期限切れになると、サーバーから自動的に更新します。@interface AppDelegate () @property (nonatomic, strong) OSSClient *client; @end /** * STS 情報を取得するための URL。 独自のサーバーで設定します。 */ #define OSS_STS_URL @"oss_sts_url" /** * バケットが存在するリージョンのエンドポイント。 */ #define OSS_ENDPOINT @"your bucket's endpoint" /** * バケットが存在するリージョン。 */ #define OSS_REGION @"your bucket's region" @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // アプリケーション起動後のカスタマイズのためのオーバーライドポイント。 // OSSClient インスタンスを初期化します。 [self setupOSSClient]; return YES; } - (void)setupOSSClient { // 認証情報を自動的に更新するプロバイダーを初期化します。 id<OSSCredentialProvider> credentialProvider = [[OSSAuthCredentialProvider alloc] initWithAuthServerUrl:OSS_STS_URL]; // タイムアウト期間や DNS 事前解決などのクライアント側の設定。 OSSClientConfiguration *cfg = [[OSSClientConfiguration alloc] init]; cfg.signVersion = OSSSignVersionV4; client = [[OSSClient alloc] initWithEndpoint:OSS_ENDPOINT credentialProvider:credentialProvider clientConfiguration:cfg]; client.region = OSS_REGION; }説明アプリが 1 つのリージョン内の単一のバケットを使用する場合、OSSClient のライフサイクルをアプリケーションのライフサイクルに合わせます。 「リージョンとエンドポイント」をご参照ください。
-
-
バケットを作成します。
次のコードは、
examplebucketという名前のバケットを作成します。// バケットを作成するリクエストを作成します。 OSSCreateBucketRequest * create = [OSSCreateBucketRequest new]; // バケット名を examplebucket に設定します。 create.bucketName = @"examplebucket"; // アクセス制御リスト (ACL) を private に設定します。 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 にアップロードします。
パラメーター
説明
bucketNameターゲットバケットの名前。 例:
examplebucket。objectKeyオブジェクトの完全なパス (バケット名は含みません)。 例:
exampledir/testdir/exampleobject.txt。uploadingFileURLローカルファイルのパス (
NSURL形式)。uploadingDatauploadingFileURLの代替として、NSDataを直接渡します。uploadProgress今回送信されたバイト数、送信済みの合計バイト数、送信予定の合計バイト数を報告するコールバックブロック。
OSSPutObjectRequest * put = [OSSPutObjectRequest new]; // バケット名を指定します。 例: examplebucket。 put.bucketName = @"examplebucket"; // オブジェクトの完全なパスを指定します。 バケット名は含めないでください。 例: exampledir/testdir/exampleobject.txt。 put.objectKey = @"exampledir/testdir/exampleobject.txt"; put.uploadingFileURL = [NSURL fileURLWithPath:@"<filePath>"]; // または、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]; -
オブジェクトをダウンロードします。
次のコードは、オブジェクトをローカルデバイスにダウンロードします。
パラメーター
説明
bucketNameオブジェクトを含むバケットの名前。 例:
examplebucket。objectKeyオブジェクトの完全なパス (バケット名は含みません)。 例:
exampledir/testdir/exampleobject.txt。downloadProgress今回書き込まれたバイト数、書き込み済みの合計バイト数、書き込み予定の合計バイト数を報告するコールバックブロック。
OSSGetObjectRequest * request = [OSSGetObjectRequest new]; // バケット名を指定します。 例: examplebucket。 request.bucketName = @"examplebucket"; // オブジェクトの完全なパスを指定します。 バケット名は含めないでください。 例: 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];