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

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

次の手順を開始する前に、Swift で iOS 用の「API Gateway コンソールを使用して 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 に設定する必要があります。

  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 プロジェクトに追加します。

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

      ヒント

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

    7. Xcode プロジェクトを構築し、それが適切に設定されていることを確認してから先に進みます。Xcode で使用している Swift のバージョンが AWS Mobile SDK でサポートされているものより新しい場合は、Swift コンパイラエラーが発生します。この場合は、[Swift Compiler - Version (Swift コンパイラ - バージョン)] 設定の [Use 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 エンコードされたパス変数が処理されないためです。