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 でインストールして使用するには
-
ダウンロード済みの 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フォルダーもあります。 -
Xcode を起動し、新しい iOS Objective-C プロジェクトを作成します。プロジェクトのターゲットを書き留めておきます。それを
Podfileに設定する必要があります。
-
CocoaPods を使用して AWS Mobile SDK for iOS を Xcode プロジェクト内にインポートするには、以下の操作を行います。
-
ターミナルウィンドウで次のコマンドを実行して、CocoaPods をインストールします。
sudo gem install cocoapods pod setup -
抽出した SDK フォルダー内にある
Podfileファイルを、Xcode プロジェクトファイルがある同じディレクトリ内にコピーします。次のブロックのターゲット名をtarget '<YourXcodeTarget>' do pod 'AWSAPIGateway', '~> 2.4.7' end次のようにプロジェクトのターゲット名に置き換えます。
target 'app_objc_simple_calc' do pod 'AWSAPIGateway', '~> 2.4.7' endXcode プロジェクトに
Podfileという名前のファイルが既に含まれている場合は、次のコード行を追加します。pod 'AWSAPIGateway', '~> 2.4.7' -
ターミナルウィンドウを開いて、次のコマンドを実行します。
pod installこれにより、API Gateway コンポーネント とその他の依存する AWS Mobile SDK コンポーネントがインストールされます。
-
Xcode プロジェクトを閉じて
.xcworkspaceファイルを開き、Xcode を再起動します。 -
抽出した SDK の
.hディレクトリから、すべての.mファイルとgenerated-srcファイルを Xcode プロジェクト内に追加します。
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_CALCInput と SIMPLE_CALCResult になります。API のリクエストとレスポンスは、次のように SDK メソッドにマッピングされます。
-
次の API リクエストは
GET /?a=...&b=...&op=...次のような SDK メソッドになります。
(AWSTask *)rootGet:(NSString *)op a:(NSString *)a b:(NSString *)bAWSTask.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 を呼び出すには
-
API クライアントクラスのヘッダーファイルをインポートして、API クライアントクラスをアプリケーションで呼び出せるようにします。
#import "SIMPLE_CALCSimpleCalc.h"#importステートメントにより、2 つのモデルクラスとしてSIMPLE_CALCInput.hとSIMPLE_CALCResult.hもインポートされます。 -
API クライアントクラスをインスタンス化します。
SIMPLE_CALCSimpleCalcClient *apiInstance = [SIMPLE_CALCSimpleCalcClient defaultClient];API で Amazon Cognito を使用するには、
defaultClientメソッドを呼び出して API クライアントオブジェクトを作成する (前の例を参照) 前に、次に示すようにデフォルトのAWSServiceManagerオブジェクトでdefaultServiceConfigurationプロパティを設定します。AWSCognitoCredentialsProvider *creds = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1identityPoolId:your_cognito_pool_id]; AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1credentialsProvider:creds]; AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = configuration; -
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と表示されます。 -
ペイロードを渡す
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と表示されます。 -
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 にインストールして使用するには
-
ダウンロード済みの 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フォルダーもあります。 -
Xcode を起動し、新しい iOS Swift プロジェクトを作成します。プロジェクトのターゲットを書き留めておきます。それを
Podfileに設定する必要があります。
-
CocoaPods を使用して AWS Mobile SDK の必要なコンポーネントを Xcode プロジェクト内にインポートするには、以下の操作を実行します。
-
ターミナルウィンドウで次のコマンドを実行して CocoaPods をインストールします (まだインストールしていない場合)。
sudo gem install cocoapods pod setup -
抽出した SDK フォルダー内にある
Podfileファイルを、Xcode プロジェクトファイルがある同じディレクトリ内にコピーします。次のブロックのターゲット名をtarget '<YourXcodeTarget>' do pod 'AWSAPIGateway', '~> 2.4.7' end次のようにプロジェクトのターゲット名に置き換えます。
target 'app_swift_simple_calc' do pod 'AWSAPIGateway', '~> 2.4.7' endXcode プロジェクト内の
Podfileに正しいターゲットが既に設定されている場合は、次のコード行をdo ... endループに追加するだけで済みます。pod 'AWSAPIGateway', '~> 2.4.7' -
ターミナルウィンドウを開き、アプリケーションのディレクトリで次のコマンドを実行します。
pod installこれにより、API Gateway コンポーネント とその他の依存する AWS Mobile SDK コンポーネントがアプリケーションのプロジェクト内にインストールされます。
-
Xcode プロジェクトを閉じて
*.xcworkspaceファイルを開き、Xcode を再起動します。 -
抽出した
.hディレクトリから、SDK のヘッダーファイル (.swift) と Swift ソースコードファイル (generated-src) のすべてを Xcode プロジェクトに追加します。
-
Swift コードプロジェクトから AWS Mobile SDK の Objective-C ライブラリを呼び出せるようにするには、Xcode プロジェクト設定の [
Bridging_Header.hSwift Compiler - General] オプションの [Objective-C Bridging Header] プロパティで ファイルのパスを設定します。
ヒント
Xcode の検索ボックスに「
bridging」と入力し、[Objective-C Bridging Header] プロパティを見つけます。 -
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_CALCInput と SIMPLE_CALCResult になります。API のリクエストとレスポンスは、次のように SDK メソッドにマッピングされます。
-
次の API リクエストは
GET /?a=...&b=...&op=...次のような SDK メソッドになります。
public func rootGet(op: String?, a: String?, b: String?) -> AWSTaskAWSTask.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 を呼び出すには
-
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 -
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と表示されます。 -
ペイロードを渡す
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と表示されます。 -
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 エンコードされたパス変数が処理されないためです。