

# Objective-C または Swift で REST API 用に API Gateway で生成された iOS SDK を使用する
<a name="how-to-generate-sdk-ios"></a>

このチュートリアルでは、Objective-C または Swift アプリケーションにおいて、REST API の API Gateway で生成された iOS SDK を使用して基盤となる API を呼び出す方法について説明します。以下のトピックでは、[SimpleCalc API](simple-calc-lambda-api.md) を例として使います。
+ AWS Mobile SDK の必要なコンポーネントを Xcode プロジェクト内にインストールする方法
+ API のメソッドを呼び出す前に API クライアントオブジェクトを作成する方法
+ API クライアントオブジェクトで対応する SDK メソッドを介して API のメソッドを呼び出す方法
+ SDK の対応するモデルクラスを使用してメソッドの入力を準備し、その結果を解析する方法

**Topics**
+ [生成された iOS SDK (Objective-C) を使用して API を呼び出す](#how-to-use-sdk-ios-objc)
+ [生成された iOS SDK (Swift) を使用して API を呼び出す](#how-to-generate-sdk-ios-swift)

## 生成された iOS SDK (Objective-C) を使用して API を呼び出す
<a name="how-to-use-sdk-ios-objc"></a>

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

### Objective-C プロジェクトで API Gateway で生成された AWS Mobile SDK と iOS SDK をインストールする
<a name="use-sdk-ios-objc-install-sdk"></a>

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

**API Gateway で生成された iOS SDK を Objective-C でインストールして使用するには**

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

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

      
![\[Xcode でターゲットを検索します。\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/use-sdk-in-ios-objc-project-find-target.png)

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

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

      ```
      sudo gem install cocoapods
      pod setup
      ```

   1. 抽出した 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'
      ```

   1. ターミナルウィンドウを開いて、次のコマンドを実行します。

      ```
      pod install
      ```

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

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

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

         
![\[.h ファイルと .m ファイルは generated-src にあります\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/use-sdk-in-ios-objc-project-add-sdk-src.png)

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

### API Gateway で生成された iOS SDK を使用して Objective-C オブジェクトで API メソッドを呼び出す
<a name="use-sdk-ios-objc-call-sdk"></a>

SDK の生成時に、メソッドの入力 (`Input`) と出力 (`Result`) を 2 つのモデルとする [SimpleCalc API](simple-calc-lambda-api.md) のプレフィックスとして `SIMPLE_CALC` を使用すると、結果の API クライアントクラスは `SIMPLE_CALCSimpleCalcClient` となり、対応するデータクラスはそれぞれ `SIMPLE_CALCInput` と `SIMPLE_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.h` と `SIMPLE_CALCResult.h` もインポートされます。

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

   ```
   SIMPLE_CALCSimpleCalcClient *apiInstance = [SIMPLE_CALCSimpleCalcClient defaultClient];
   ```

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

   ```
   AWSCognitoCredentialsProvider *creds = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1 identityPoolId:your_cognito_pool_id];
   AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:creds];
   AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = configuration;
   ```

1. `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` と表示されます。

1. ペイロードを渡す `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` と表示されます。

1. `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 関数](simple-calc-nodejs-lambda-function.md)では URL エンコードされたパス変数が処理されないためです。

## 生成された iOS SDK (Swift) を使用して API を呼び出す
<a name="how-to-generate-sdk-ios-swift"></a>

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

**Topics**
+ [Swift プロジェクトで AWS Mobile SDK と API Gateway で生成された SDK をインストールする](#use-sdk-ios-swift-install-sdk)
+ [API Gateway で生成された iOS SDK を介して Swift プロジェクトで API メソッドを呼び出す](#use-sdk-ios-swift-call-api)

### Swift プロジェクトで AWS Mobile SDK と API Gateway で生成された SDK をインストールする
<a name="use-sdk-ios-swift-install-sdk"></a>

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

**API Gateway で生成された iOS SDK を Swift にインストールして使用するには**

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

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

      
![\[Xcode でターゲットを検索します。\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/use-sdk-in-ios-swift-project-find-target.png)

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

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

      ```
      sudo gem install cocoapods
      pod setup
      ```

   1. 抽出した 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'
      ```

   1. ターミナルウィンドウを開き、アプリケーションのディレクトリで次のコマンドを実行します。

      ```
      pod install
      ```

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

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

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

         
![\[.h ファイルと .swift ファイルは generated-src にあります。\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/use-sdk-in-ios-swift-project-add-sdk-src.png)

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

         
![\[[Swift Compiler - General] で Bridging_Header.h ファイルパスを設定します。\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/use-sdk-in-ios-swift-project-set-bridging-header.png)
**ヒント**  
Xcode の検索ボックスに「**bridging**」と入力し、[**Objective-C Bridging Header**] プロパティを見つけます。

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

         
![\[[Legacy Swift Language Version] プロパティを [Yes] に設定します。\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/use-sdk-in-ios-swift-project-set-legacy-swift-version.png)

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

### API Gateway で生成された iOS SDK を介して Swift プロジェクトで API メソッドを呼び出す
<a name="use-sdk-ios-swift-call-api"></a>

SDK の生成時に、API のリクエストとレスポンスの入力 (`Input`) と出力 (`Result`) を記述する 2 つのモデルがあるこの [SimpleCalc API](simple-calc-lambda-api.md) のプレフィックスとして `SIMPLE_CALC` を使用すると、結果の API クライアントクラスは `SIMPLE_CALCSimpleCalcClient` となり、対応するデータクラスはそれぞれ `SIMPLE_CALCInput` と `SIMPLE_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 を使用するには、AWS メソッド (前出) を取得する前にデフォルトの `default` のサービス設定 (後出) を設定します。

   ```
   let credentialsProvider = AWSCognitoCredentialsProvider(regionType: AWSRegionType.USEast1, identityPoolId: "my_pool_id")        
   let configuration = AWSServiceConfiguration(region: AWSRegionType.USEast1, credentialsProvider: credentialsProvider)        
   AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration
   ```

1. `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` と表示されます。

1. ペイロードを渡す `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` と表示されます。

1. `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 関数](simple-calc-nodejs-lambda-function.md)では URL エンコードされたパス変数が処理されないためです。