在 Objective-C 或 Swift 中使用 API Gateway 為 REST API 產生的 iOS 軟體開發套件
在本教學中,我們會示範如何在 Objective-C 或 Swift 應用程式中,使用 API Gateway 為 REST API 產生的 iOS 軟體開發套件,以呼叫基礎 API。我們會以 SimpleCalc API 為例,說明下列主題:
-
如何將所需的 AWS Mobile 軟體開發套件元件安裝到您的 Xcode 專案
-
如何在呼叫 API 的方法前,先建立 API 用戶端物件
-
如何透過 API 用戶端物件上對應的開發套件方法呼叫 API 方法
-
如何使用開發套件的對應模型類別準備方法輸入和剖析其結果
使用產生的 iOS 開發套件 (Objective-C) 呼叫 API
開始下列程序之前,您必須先在 Objective-C 中完成在 API Gateway 中為 REST API 產生 SDK中的 iOS 步驟,並下載已產生之軟體開發套件的 .zip 檔案。
安裝 AWS Mobile 軟體開發套件和 API Gateway 在 Objective-C 專案中產生的 iOS 軟體開發套件
下列程序說明如何安裝開發套件。
安裝和使用 API Gateway 在 Objective-C 中產生的 iOS 軟體開發套件
-
將您稍早下載之 API Gateway 所產生的 .zip 檔案內容解壓縮。使用 SimpleCalc API,您可能希望將解壓縮的開發套件資料夾重新命名成類似
sdk_objc_simple_calc
。在這個開發套件資料夾中,有README.md
檔案和Podfile
檔案。README.md
檔案包含開發套件的安裝和使用說明。本教學提供這些說明的詳細資訊。安裝作業將利用 CocoaPods匯入所需的 API Gateway 程式庫,以及其他相依的 AWS Mobile 軟體開發套件元件。您必須更新 Podfile
,將開發套件匯入至您應用程式的 Xcode 專案。未封存的開發套件資料夾也包含generated-src
資料夾,其中包含 API 之已產生開發套件的原始程式碼。 -
啟動 Xcode 並建立新的 iOS Objective-C 專案。請記下專案的目標。您需要在
Podfile
中設定它。 -
若要使用 CocoaPods 將 AWS Mobile SDK for iOS 匯入 Xcode 專案,請執行下列操作:
-
在終端機視窗中執行下列命令來安裝 CocoaPods:
sudo gem install cocoapods pod setup
-
將
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'
-
開啟終端機視窗並執行下列命令:
pod install
這會安裝 API Gateway 元件和其他相依的 AWS Mobile 軟體開發套件元件。
-
關閉 Xcode 專案,然後開啟
.xcworkspace
檔案重新啟動 Xcode。 -
從解壓縮的開發套件
.h
目錄將所有的.m
和generated-src
檔案新增到您的 Xcode 專案。
若要透過明確下載 AWS Mobile SDK for iOS Mobile 開發套件或使用 AWSCarthage,將
Objective-C 匯入您的專案,請遵循 README.md 檔案中的說明執行操作。請務必只使用其中一個選項來匯入 AWS Mobile 軟體開發套件。 -
使用 Objective-C 專案中 API Gateway 產生的 iOS 軟體開發套件呼叫 API 方法
當您使用兩個模型來處理這些方法的輸入 (SIMPLE_CALC
) 和輸出 (Input
),為這個 SimpleCalc API 產生字首為 Result
的開發套件後,在開發套件中,產生的 API 用戶端類別會變為 SIMPLE_CALCSimpleCalcClient
,而對應的資料類別則會分別成為 SIMPLE_CALCInput
和 SIMPLE_CALCResult
。API 請求和回應會對應至開發套件方法,如下所示:
-
下列的 API 請求:
GET /?a=...&b=...&op=...
會成為下列的開發套件方法:
(AWSTask *)rootGet:(NSString *)op a:(NSString *)a b:(NSString *)b
如果
AWSTask.result
模型已新增至方法回應,則SIMPLE_CALCResult
屬性為Result
類型。否則,屬性為NSDictionary
類型。 -
下列的此 API 請求:
POST / { "a": "Number", "b": "Number", "op": "String" }
會成為下列的開發套件方法:
(AWSTask *)rootPost:(SIMPLE_CALCInput *)body
-
下列的 API 請求:
GET /{a}/{b}/{op}
會成為下列的開發套件方法:
(AWSTask *)aBOpGet:(NSString *)a b:(NSString *)b op:(NSString *)op
下列程序說明如何在 Objective-C 應用程式原始碼中呼叫 API 方法;例如,在 viewDidLoad
檔案中作為 ViewController.m
委派的一部分。
透過 API Gateway 所產生的 iOS 軟體開發套件來呼叫 API
-
匯入 API 用戶端類別標頭檔案,以能在應用程式中呼叫 API 用戶端類別:
#import "SIMPLE_CALCSimpleCalc.h"
#import
陳述式也針對兩個模型類別匯入SIMPLE_CALCInput.h
和SIMPLE_CALCResult.h
。 -
將 API 用戶端類別執行個體化:
SIMPLE_CALCSimpleCalcClient *apiInstance = [SIMPLE_CALCSimpleCalcClient defaultClient];
若要使用 Amazon Cognito 與 API,請先在預設的
AWSServiceManager
物件上設定defaultServiceConfiguration
屬性,如下所示,然後呼叫defaultClient
方法以建立 API 用戶端物件 (如前例所示):AWSCognitoCredentialsProvider *creds = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:
AWSRegionUSEast1
identityPoolId:your_cognito_pool_id
]; AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1
credentialsProvider: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 開發套件 (Swift) 呼叫 API
開始下列程序之前,您必須先在 Swift 中完成在 API Gateway 中為 REST API 產生 SDK中的 iOS 步驟,並下載已產生之軟體開發套件的 .zip 檔案。
主題
在 Swift 專案中安裝 AWS Mobile 軟體開發套件和 API Gateway 產生的軟體開發套件
下列程序說明如何安裝開發套件。
安裝和使用 API Gateway 在 Swift 中產生的 iOS 軟體開發套件
-
將您稍早下載之 API Gateway 所產生的 .zip 檔案內容解壓縮。使用 SimpleCalc API,您可能希望將解壓縮的開發套件資料夾重新命名成類似
sdk_swift_simple_calc
。在這個開發套件資料夾中,有README.md
檔案和Podfile
檔案。README.md
檔案包含開發套件的安裝和使用說明。本教學提供這些說明的詳細資訊。安裝會利用 CocoaPods來匯入所需的 AWS Mobile 開發套件元件。您必須更新 Podfile
,以將開發套件匯入至您 Swift 應用程式的 Xcode 專案。未封存的開發套件資料夾也包含generated-src
資料夾,其中包含 API 之已產生開發套件的原始程式碼。 -
啟動 Xcode 並建立新的 iOS Swift 專案。請記下專案的目標。您需要在
Podfile
中設定它。 -
若要使用 CocoaPods 將所需的 AWS Mobile 軟體開發套件元件匯入 Xcode 專案,請執行下列操作:
-
如果未安裝,請在終端機視窗中執行下列命令來安裝 CocoaPods:
sudo gem install cocoapods pod setup
-
將
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'
-
開啟終端機視窗,並在應用程式目錄中執行下列命令:
pod install
這會將 API Gateway 元件和任何相依的 AWS Mobile 軟體開發套件元件安裝至應用程式的專案中。
-
關閉 Xcode 專案,然後開啟
*.xcworkspace
檔案重新啟動 Xcode。 -
將所有開發套件的標頭檔案 (
.h
) 和 Swift 原始程式碼檔案 (.swift
) 從擷取的generated-src
目錄新增至 Xcode 專案。 -
若要從 Swift 程式碼專案中啟用呼叫 AWS Mobile 開發套件的 Objective-C 程式庫,請在 Xcode 專案組態的
Bridging_Header.h
Swift Compiler - General (Swift 編譯器 - 一般) 設定下方,於 Objective-C Bridging Header (Objective-C 橋接標頭) 屬性上設定 檔案路徑:提示
您可以在 Xcode 的搜尋方塊中輸入
bridging
,以尋找 Objective-C Bridging Header (Objective-C 橋接標頭) 屬性。 -
建置 Xcode 專案,驗證已正確地設定它,再繼續進行。如果您的 Xcode 使用比 AWS Mobile 軟體開發套件支援的 Swift 版本還要新的 Swift 版本,則會取得 Swift 編譯器錯誤。在這種情況下,於 Swift Compiler - Version (Swift 編譯器 - 版本) 設定下方,將 Use Legacy Swift Language Version (使用傳統 Swift 語言版本) 屬性設定為 Yes (是):
若要明確下載 AWS Mobile 開發套件或使用 Carthage
以將 Swift 中的 AWS Mobile SDK for iOS 匯入至專案,請遵循開發套件套件所隨附之 README.md
檔案中的說明。請務必只使用其中一個選項來匯入 AWS Mobile 軟體開發套件。 -
在 Swift 專案中透過 API Gateway 所產生的 iOS 軟體開發套件來呼叫 API 方法
當您使用兩個模型說明 API 請求和回應的輸入 (Input
) 和輸出 (Result
),為這個 SimpleCalc API 產生字首為 SIMPLE_CALC
的開發套件後,在開發套件中,產生的 API 用戶端類別會變為 SIMPLE_CALCSimpleCalcClient
,而對應的資料類別則會分別成為 SIMPLE_CALCInput
和 SIMPLE_CALCResult
。API 請求和回應會對應至開發套件方法,如下所示:
-
下列的 API 請求:
GET /?a=...&b=...&op=...
會成為下列的開發套件方法:
public func rootGet(op: String?, a: String?, b: String?) -> AWSTask
如果
AWSTask.result
模型已新增至方法回應,則SIMPLE_CALCResult
屬性為Result
類型。否則,它為NSDictionary
類型。 -
下列的此 API 請求:
POST / { "a": "Number", "b": "Number", "op": "String" }
會成為下列的開發套件方法:
public func rootPost(body: SIMPLE_CALCInput) -> AWSTask
-
下列的 API 請求:
GET /{a}/{b}/{op}
會成為下列的開發套件方法:
public func aBOpGet(a: String, b: String, op: String) -> AWSTask
下列程序說明如何在 Swift 應用程式原始碼中呼叫 API 方法;例如,在 viewDidLoad()
檔案中做為 ViewController.m
委派的一部分。
透過 API Gateway 所產生的 iOS 軟體開發套件來呼叫 API
-
將 API 用戶端類別執行個體化:
let client = SIMPLE_CALCSimpleCalcClient.default()
若要搭配使用 Amazon Cognito 與 API,請先設定預設 AWS 服務組態 (如下所示),再取得
default
方法 (如先前所示):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 }
其中,helper 函數
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 編碼的路徑變數。