Objective-C または Swift で REST API 用に API Gateway で生成された iOS SDK を使用する - Amazon API Gateway

Objective-C または Swift で REST API 用に API Gateway で生成された iOS SDK を使用する

このチュートリアルでは、Objective-C または Swift アプリケーションにおいて、REST API の API Gateway で生成された iOS SDK を使用して基盤となる API を呼び出す方法について説明します。以下のトピックでは、SimpleCalc API を例として使います。

  • AWS Mobile SDK の必要なコンポーネントを Xcode プロジェクト内にインストールする方法

  • API のメソッドを呼び出す前に API クライアントオブジェクトを作成する方法

  • API クライアントオブジェクトで対応する SDK メソッドを介して API のメソッドを呼び出す方法

  • SDK の対応するモデルクラスを使用してメソッドの入力を準備し、その結果を解析する方法

生成された iOS SDK (Objective-C) を使用して API を呼び出す

次の手順を開始する前に、Objective-C で iOS 用の「API Gateway で REST API の SDK を生成する」のステップを実行し、生成された SDK の .zip ファイルをダウンロードする必要があります。

API Gateway で生成された AWS Mobile SDK と iOS SDK を Objective-C プロジェクトでインストールする

次の手順では、SDK をインストールする方法を説明します。

API Gateway で生成された iOS SDK を Objective-C でインストールして使用するには
  1. ダウンロード済みの API Gateway で生成された .zip ファイルのコンテンツを抽出します。SimpleCalc API を使用して、解凍した SDK フォルダの名前を sdk_objc_simple_calc などに変更することもできます。この SDK フォルダーには、README.md ファイルと Podfile ファイルが含まれています。README.md ファイルには、SDK をインストールして使用するための手順が記載されています。このチュートリアルでは、この手順について詳しく説明します。インストールでは、CocoaPods を使用して必要な API Gateway ライブラリとその他の依存する AWS Mobile SDK コンポーネントをインポートします。SDK をアプリケーションの XCode プロジェクト内にインポートするには、Podfile を更新する必要があります。解凍した SDK フォルダー内には、API の生成された SDK のソースコードを含む generated-src フォルダーもあります。

  2. Xcode を起動し、新しい iOS Objective-C プロジェクトを作成します。プロジェクトのターゲットを書き留めておきます。それを Podfile に設定する必要があります。

    Xcode でターゲットを検索します。
  3. CocoaPods を使用して AWS Mobile SDK for iOS を Xcode プロジェクト内にインポートするには、以下の操作を行います。

    1. ターミナルウィンドウで次のコマンドを実行して、CocoaPods をインストールします。

      sudo gem install cocoapods pod setup
    2. 抽出した SDK フォルダー内にある Podfile ファイルを、Xcode プロジェクトファイルがある同じディレクトリ内にコピーします。次のブロックのターゲット名を

      target '<YourXcodeTarget>' do pod 'AWSAPIGateway', '~> 2.4.7' end

      次のようにプロジェクトのターゲット名に置き換えます。

      target 'app_objc_simple_calc' do pod 'AWSAPIGateway', '~> 2.4.7' end

      Xcode プロジェクトに Podfile という名前のファイルが既に含まれている場合は、次のコード行を追加します。

      pod 'AWSAPIGateway', '~> 2.4.7'
    3. ターミナルウィンドウを開いて、次のコマンドを実行します。

      pod install

      これにより、API Gateway コンポーネント とその他の依存する AWS Mobile SDK コンポーネントがインストールされます。

    4. Xcode プロジェクトを閉じて .xcworkspace ファイルを開き、Xcode を再起動します。

    5. 抽出した SDK の .h ディレクトリから、すべての .m ファイルと generated-src ファイルを Xcode プロジェクト内に追加します。

      .h ファイルと .m ファイルは generated-src にあります

    AWS Mobile SDK for iOS Objective-C をプロジェクト内にインポートするために、明示的に AWS Mobile SDK をダウンロードするか、Carthage を使用する場合は、README.md ファイルの手順に従ってください。この 2 つのオプションのうち、必ず 1 つのみを使用して AWS Mobile SDK をインポートしてください。

API Gateway で生成された iOS SDK を使用して Objective-C オブジェクトで API メソッドを呼び出す

SDK の生成時に、メソッドの入力 (Input) と出力 (Result) を 2 つのモデルとする SimpleCalc API のプレフィックスとして SIMPLE_CALC を使用すると、結果の API クライアントクラスは SIMPLE_CALCSimpleCalcClient となり、対応するデータクラスはそれぞれ SIMPLE_CALCInputSIMPLE_CALCResult になります。API のリクエストとレスポンスは、次のように SDK メソッドにマッピングされます。

  • 次の API リクエストは

    GET /?a=...&b=...&op=...

    次のような SDK メソッドになります。

    (AWSTask *)rootGet:(NSString *)op a:(NSString *)a b:(NSString *)b

    AWSTask.result モデルをメソッドのレスポンスに追加した場合、SIMPLE_CALCResult プロパティのタイプは Result です。それ以外の場合、プロパティは NSDictionary タイプになります。

  • 次の API リクエストは

    POST / { "a": "Number", "b": "Number", "op": "String" }

    次のような SDK メソッドになります。

    (AWSTask *)rootPost:(SIMPLE_CALCInput *)body
  • 次の API リクエストは

    GET /{a}/{b}/{op}

    次のような SDK メソッドになります。

    (AWSTask *)aBOpGet:(NSString *)a b:(NSString *)b op:(NSString *)op

次の手順では、Objective-C アプリケーションのソースコードで API メソッドを呼び出す方法を説明します。たとえば、viewDidLoad ファイルで ViewController.m デリゲートの一部として呼び出します。

API Gateway で生成された iOS SDK を介して API を呼び出すには
  1. API クライアントクラスのヘッダーファイルをインポートして、API クライアントクラスをアプリケーションで呼び出せるようにします。

    #import "SIMPLE_CALCSimpleCalc.h"

    #import ステートメントにより、2 つのモデルクラスとして SIMPLE_CALCInput.hSIMPLE_CALCResult.h もインポートされます。

  2. API クライアントクラスをインスタンス化します。

    SIMPLE_CALCSimpleCalcClient *apiInstance = [SIMPLE_CALCSimpleCalcClient defaultClient];

    API で Amazon Cognito を使用するには、defaultClient メソッドを呼び出して API クライアントオブジェクトを作成する (前の例を参照) 前に、次に示すようにデフォルトの AWSServiceManager オブジェクトで defaultServiceConfiguration プロパティを設定します。

    AWSCognitoCredentialsProvider *creds = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1 identityPoolId:your_cognito_pool_id]; AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:creds]; AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = configuration;
  3. GET /?a=1&b=2&op=+ メソッドを呼び出して、1+2 を実行します。

    [[apiInstance rootGet: @"+" a:@"1" b:@"2"] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) { _textField1.text = [self handleApiResponse:task]; return nil; }];

    ヘルパー関数の handleApiResponse:task は、結果を文字列としてフォーマットし、テキストフィールド (_textField1) に表示します。

    - (NSString *)handleApiResponse:(AWSTask *)task { if (task.error != nil) { return [NSString stringWithFormat: @"Error: %@", task.error.description]; } else if (task.result != nil && [task.result isKindOfClass:[SIMPLE_CALCResult class]]) { return [NSString stringWithFormat:@"%@ %@ %@ = %@\n",task.result.input.a, task.result.input.op, task.result.input.b, task.result.output.c]; } return nil; }

    結果として 1 + 2 = 3 と表示されます。

  4. ペイロードを渡す POST / を呼び出して、1-2 を実行します。

    SIMPLE_CALCInput *input = [[SIMPLE_CALCInput alloc] init]; input.a = [NSNumber numberWithInt:1]; input.b = [NSNumber numberWithInt:2]; input.op = @"-"; [[apiInstance rootPost:input] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) { _textField2.text = [self handleApiResponse:task]; return nil; }];

    結果として 1 - 2 = -1 と表示されます。

  5. GET /{a}/{b}/{op} を呼び出して、1/2 を実行します。

    [[apiInstance aBOpGet:@"1" b:@"2" op:@"div"] continueWithBlock:^id _Nullable(AWSTask * _Nonnull task) { _textField3.text = [self handleApiResponse:task]; return nil; }];

    結果として 1 div 2 = 0.5 と表示されます。ここで div/ の代わりに使用されているのは、バックエンドのシンプルな Lambda 関数では URL エンコードされたパス変数が処理されないためです。

生成された iOS SDK (Swift) を使用して API を呼び出す

次の手順を開始する前に、Swift で iOS 用の「API Gateway で REST API の SDK を生成する」のステップを実行し、生成された SDK の .zip ファイルをダウンロードする必要があります。

AWS Mobile SDK と API Gateway で生成された SDK を Swift プロジェクトでインストールする

次の手順では、SDK をインストールする方法を説明します。

API Gateway で生成された iOS SDK を Swift にインストールして使用するには
  1. ダウンロード済みの API Gateway で生成された .zip ファイルのコンテンツを抽出します。SimpleCalc API を使用して、解凍した SDK フォルダの名前を sdk_swift_simple_calc などに変更することもできます。この SDK フォルダーには、README.md ファイルと Podfile ファイルが含まれています。README.md ファイルには、SDK をインストールして使用するための手順が記載されています。このチュートリアルでは、この手順について詳しく説明します。インストールでは、CocoaPods を使用して AWS Mobile SDK の必要なコンポーネントをインポートします。SDK を Swift アプリケーションの XCode プロジェクト内にインポートするには、Podfile を更新する必要があります。解凍した SDK フォルダー内には、API の生成された SDK のソースコードを含む generated-src フォルダーもあります。

  2. Xcode を起動し、新しい iOS Swift プロジェクトを作成します。プロジェクトのターゲットを書き留めておきます。それを Podfile に設定する必要があります。

    Xcode でターゲットを検索します。
  3. CocoaPods を使用して AWS Mobile SDK の必要なコンポーネントを Xcode プロジェクト内にインポートするには、以下の操作を実行します。

    1. ターミナルウィンドウで次のコマンドを実行して CocoaPods をインストールします (まだインストールしていない場合)。

      sudo gem install cocoapods pod setup
    2. 抽出した SDK フォルダー内にある Podfile ファイルを、Xcode プロジェクトファイルがある同じディレクトリ内にコピーします。次のブロックのターゲット名を

      target '<YourXcodeTarget>' do pod 'AWSAPIGateway', '~> 2.4.7' end

      次のようにプロジェクトのターゲット名に置き換えます。

      target 'app_swift_simple_calc' do pod 'AWSAPIGateway', '~> 2.4.7' end

      Xcode プロジェクト内の Podfile に正しいターゲットが既に設定されている場合は、次のコード行を do ... end ループに追加するだけで済みます。

      pod 'AWSAPIGateway', '~> 2.4.7'
    3. ターミナルウィンドウを開き、アプリケーションのディレクトリで次のコマンドを実行します。

      pod install

      これにより、API Gateway コンポーネント とその他の依存する AWS Mobile SDK コンポーネントがアプリケーションのプロジェクト内にインストールされます。

    4. Xcode プロジェクトを閉じて *.xcworkspace ファイルを開き、Xcode を再起動します。

    5. 抽出した .h ディレクトリから、SDK のヘッダーファイル (.swift) と Swift ソースコードファイル (generated-src) のすべてを Xcode プロジェクトに追加します。

      .h ファイルと .swift ファイルは generated-src にあります。
    6. Swift コードプロジェクトから AWS Mobile SDK の Objective-C ライブラリを呼び出せるようにするには、Xcode プロジェクト設定の [Bridging_Header.hSwift Compiler - General] オプションの [Objective-C Bridging Header] プロパティで ファイルのパスを設定します。

      [Swift Compiler - General] で Bridging_Header.h ファイルパスを設定します。
      ヒント

      Xcode の検索ボックスに「bridging」と入力し、[Objective-C Bridging Header] プロパティを見つけます。

    7. Xcode プロジェクトを構築し、それが適切に設定されていることを確認してから先に進みます。Xcode で使用している Swift のバージョンが AWS Mobile SDK でサポートされているものより新しい場合は、Swift コンパイラエラーが発生します。この場合は、[Swift Compiler - Version (Swift コンパイラ - バージョン)] 設定の [Use Legacy Swift Language Version] プロパティを [Yes] に設定します。

      [Legacy Swift Language Version] プロパティを [Yes] に設定します。

    Swift で の AWS Mobile SDK for iOS をプロジェクト内にインポートするために、明示的に AWS Mobile SDK をダウンロードするか、Carthage を使用する場合は、SDK パッケージに含まれている README.md ファイルに記載されている手順に従います。この 2 つのオプションのうち、必ず 1 つのみを使用して AWS Mobile SDK をインポートしてください。

API Gateway で生成された iOS SDK を介して Swift プロジェクトで API メソッドを呼び出す

SDK の生成時に、API のリクエストとレスポンスの入力 (Input) と出力 (Result) を記述する 2 つのモデルがあるこの SimpleCalc API のプレフィックスとして SIMPLE_CALC を使用すると、結果の API クライアントクラスは SIMPLE_CALCSimpleCalcClient となり、対応するデータクラスはそれぞれ SIMPLE_CALCInputSIMPLE_CALCResult になります。API のリクエストとレスポンスは、次のように SDK メソッドにマッピングされます。

  • 次の API リクエストは

    GET /?a=...&b=...&op=...

    次のような SDK メソッドになります。

    public func rootGet(op: String?, a: String?, b: String?) -> AWSTask

    AWSTask.result モデルをメソッドのレスポンスに追加した場合、SIMPLE_CALCResult プロパティのタイプは Result です。それ以外の場合は、NSDictionary タイプになります。

  • 次の API リクエストは

    POST / { "a": "Number", "b": "Number", "op": "String" }

    次のような SDK メソッドになります。

    public func rootPost(body: SIMPLE_CALCInput) -> AWSTask
  • 次の API リクエストは

    GET /{a}/{b}/{op}

    次のような SDK メソッドになります。

    public func aBOpGet(a: String, b: String, op: String) -> AWSTask

次の手順では、Swift アプリケーションのソースコードで API メソッドを呼び出す方法を示します。たとえば、viewDidLoad() ファイルで ViewController.m デリゲートの一部として呼び出します。

API Gateway で生成された iOS SDK を介して API を呼び出すには
  1. API クライアントクラスをインスタンス化します。

    let client = SIMPLE_CALCSimpleCalcClient.default()

    API で Amazon Cognito を使用するには、default メソッド (前出) を取得する前にデフォルトの AWS のサービス設定 (後出) を設定します。

    let credentialsProvider = AWSCognitoCredentialsProvider(regionType: AWSRegionType.USEast1, identityPoolId: "my_pool_id") let configuration = AWSServiceConfiguration(region: AWSRegionType.USEast1, credentialsProvider: credentialsProvider) AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration
  2. GET /?a=1&b=2&op=+ メソッドを呼び出して、1+2 を実行します。

    client.rootGet("+", a: "1", b:"2").continueWithBlock {(task: AWSTask) -> AnyObject? in self.showResult(task) return nil }

    上のヘルパー関数 self.showResult(task) は結果またはエラーをコンソールに表示します。次に例を示します。

    func showResult(task: AWSTask) { if let error = task.error { print("Error: \(error)") } else if let result = task.result { if result is SIMPLE_CALCResult { let res = result as! SIMPLE_CALCResult print(String(format:"%@ %@ %@ = %@", res.input!.a!, res.input!.op!, res.input!.b!, res.output!.c!)) } else if result is NSDictionary { let res = result as! NSDictionary print("NSDictionary: \(res)") } } }

    本稼働アプリケーションでは、結果またはエラーをテキストフィールドに表示できます。結果として 1 + 2 = 3 と表示されます。

  3. ペイロードを渡す POST / を呼び出して、1-2 を実行します。

    let body = SIMPLE_CALCInput() body.a=1 body.b=2 body.op="-" client.rootPost(body).continueWithBlock {(task: AWSTask) -> AnyObject? in self.showResult(task) return nil }

    結果として 1 - 2 = -1 と表示されます。

  4. GET /{a}/{b}/{op} を呼び出して、1/2 を実行します。

    client.aBOpGet("1", b:"2", op:"div").continueWithBlock {(task: AWSTask) -> AnyObject? in self.showResult(task) return nil }

    結果として 1 div 2 = 0.5 と表示されます。ここで div/ の代わりに使用されているのは、バックエンドのシンプルな Lambda 関数では URL エンコードされたパス変数が処理されないためです。