在 Objective-C 或 Swift 中使用 API Gateway 為 REST API 產生的 iOS 軟體開發套件 - Amazon API Gateway

在 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 軟體開發套件
  1. 將您稍早下載之 API Gateway 所產生的 .zip 檔案內容解壓縮。使用 SimpleCalc API,您可能希望將解壓縮的開發套件資料夾重新命名成類似 sdk_objc_simple_calc。在這個開發套件資料夾中,有 README.md 檔案和 Podfile 檔案。README.md 檔案包含開發套件的安裝和使用說明。本教學提供這些說明的詳細資訊。安裝作業將利用 CocoaPods 匯入所需的 API Gateway 程式庫,以及其他相依的 AWS Mobile 軟體開發套件元件。您必須更新 Podfile,將開發套件匯入至您應用程式的 Xcode 專案。未封存的開發套件資料夾也包含 generated-src 資料夾,其中包含 API 之已產生開發套件的原始程式碼。

  2. 啟動 Xcode 並建立新的 iOS Objective-C 專案。請記下專案的目標。您需要在 Podfile 中設定它。

    在 Xcode 中尋找目標。
  3. 若要使用 CocoaPods 將 AWS Mobile SDK for iOS 匯入 Xcode 專案,請執行下列操作:

    1. 在終端機視窗中執行下列命令來安裝 CocoaPods:

      sudo gem install cocoapods pod setup
    2. 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 軟體開發套件元件。

    4. 關閉 Xcode 專案,然後開啟 .xcworkspace 檔案重新啟動 Xcode。

    5. 從解壓縮的開發套件 .h 目錄將所有的 .mgenerated-src 檔案新增到您的 Xcode 專案。

      .h 和 .m 檔案位於產生的來源中

    若要透過明確下載 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_CALCInputSIMPLE_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
  1. 匯入 API 用戶端類別標頭檔案,以能在應用程式中呼叫 API 用戶端類別:

    #import "SIMPLE_CALCSimpleCalc.h"

    #import 陳述式也針對兩個模型類別匯入 SIMPLE_CALCInput.hSIMPLE_CALCResult.h

  2. 將 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;
  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 開發套件 (Swift) 呼叫 API

開始下列程序之前,您必須先在 Swift 中完成在 API Gateway 中為 REST API 產生 SDK中的 iOS 步驟,並下載已產生之軟體開發套件的 .zip 檔案。

在 Swift 專案中安裝 AWS Mobile 軟體開發套件和 API Gateway 產生的軟體開發套件

下列程序說明如何安裝開發套件。

安裝和使用 API Gateway 在 Swift 中產生的 iOS 軟體開發套件
  1. 將您稍早下載之 API Gateway 所產生的 .zip 檔案內容解壓縮。使用 SimpleCalc API,您可能希望將解壓縮的開發套件資料夾重新命名成類似 sdk_swift_simple_calc。在這個開發套件資料夾中,有 README.md 檔案和 Podfile 檔案。README.md 檔案包含開發套件的安裝和使用說明。本教學提供這些說明的詳細資訊。安裝會利用 CocoaPods 來匯入所需的 AWS Mobile 開發套件元件。您必須更新 Podfile,以將開發套件匯入至您 Swift 應用程式的 Xcode 專案。未封存的開發套件資料夾也包含 generated-src 資料夾,其中包含 API 之已產生開發套件的原始程式碼。

  2. 啟動 Xcode 並建立新的 iOS Swift 專案。請記下專案的目標。您需要在 Podfile 中設定它。

    在 Xcode 中尋找目標。
  3. 若要使用 CocoaPods 將所需的 AWS Mobile 軟體開發套件元件匯入 Xcode 專案,請執行下列操作:

    1. 如果未安裝,請在終端機視窗中執行下列命令來安裝 CocoaPods:

      sudo gem install cocoapods pod setup
    2. 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 軟體開發套件元件安裝至應用程式的專案中。

    4. 關閉 Xcode 專案,然後開啟 *.xcworkspace 檔案重新啟動 Xcode。

    5. 將所有開發套件的標頭檔案 (.h) 和 Swift 原始程式碼檔案 (.swift) 從擷取的 generated-src 目錄新增至 Xcode 專案。

      .h 和 .swift 檔案位於產生的來源中
    6. 若要從 Swift 程式碼專案中啟用呼叫 AWS Mobile 開發套件的 Objective-C 程式庫,請在 Xcode 專案組態的 Bridging_Header.hSwift Compiler - General (Swift 編譯器 - 一般) 設定下方,於 Objective-C Bridging Header (Objective-C 橋接標頭) 屬性上設定 檔案路徑:

      在「Swift 編譯器 - 一般」下,設定 Bridging_Header.h 檔案路徑。
      提示

      您可以在 Xcode 的搜尋方塊中輸入 bridging,以尋找 Objective-C Bridging Header (Objective-C 橋接標頭) 屬性。

    7. 建置 Xcode 專案,驗證已正確地設定它,再繼續進行。如果您的 Xcode 使用比 AWS Mobile 軟體開發套件支援的 Swift 版本還要新的 Swift 版本,則會取得 Swift 編譯器錯誤。在這種情況下,於 Swift Compiler - Version (Swift 編譯器 - 版本) 設定下方,將 Use Legacy Swift Language Version (使用傳統 Swift 語言版本) 屬性設定為 Yes (是)

      將 Legacy Swift 語言版本屬性設定為「是」。

    若要明確下載 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_CALCInputSIMPLE_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
  1. 將 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
  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 }

    其中,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

  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 編碼的路徑變數。