使用生成的 iOS 开发工具包 (Swift) 来调用 API - Amazon API Gateway
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用生成的 iOS 开发工具包 (Swift) 来调用 API

在开始以下过程之前,您必须完成 使用 API Gateway 控制台为 API 生成开发工具包 中适用于 Swift 版 iOS 的步骤,并下载已生成的开发工具包的 .zip 文件。

在 Swift 项目中安装 Amazon 移动开发工具包和 API Gateway 生成的开发工具包

以下过程将介绍如何安装开发工具包。

安装并使用 API Gateway 生成的 Swift 版 iOS 开发工具包
  1. 提取您之前下载的 API Gateway 生成的 .zip 文件中的内容。使用 SimpleCalc API,您可能需要将解压的软件开发工具包文件夹重命名为类似 sdk_swift_simple_calc 的名字。此开发工具包文件夹中有一个 README.md 文件和一个 Podfile 文件。README.md 文件包含介绍如何安装和使用开发工具包的说明。本教程将提供有关这些说明的详细信息。安装过程会利用 CocoaPods 导入必需的 Amazon 移动开发工具包组件。您必须更新 Podfile,才能将开发工具包导入 Swift 应用程序的 Xcode 项目中。解档开发工具包文件夹还包含一个 generated-src 文件夹,其中包含 API 已生成开发工具包的源代码。

  2. 启动 Xcode,并创建一个新的 iOS Swift 项目。请记下该项目的目标。您需要在 Podfile 中对其进行设置。

  3. 要使用 CocoaPods 将必需的 Amazon 移动开发工具包组件导入 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 组件及任何依赖的 Amazon 移动开发工具包组件安装到应用程序的项目中。

    4. 关闭 Xcode 项目,然后打开 *.xcworkspace 文件,以重新启动 Xcode。

    5. 将已提取 .h 目录中所有开发工具包的标头文件 (.swift) 和 Swift 源代码文件 (generated-src) 添加到您的 Xcode 项目中。

    6. 为了能够从 Swift 代码项目调用 Amazon 移动开发工具包的 Objective-C 库,请在 Xcode 项目配置的 Bridging_Header.hSwift Compiler - General 设置下,在 Objective-C Bridging Header 属性上设置 文件路径:

      提示

      您可以通过在 Xcode 的搜索框中键入 bridging 来找到 Objective-C Bridging Header 属性。

    7. 构建 Xcode 项目,以在继续进行操作之前验证它是否正确配置。如果与 Amazon 移动开发工具包支持的 Swift 版本相比,您的 Xcode 使用了更新的版本,那么您将收到 Swift 编译器错误。在这种情况下,在 Swift Compiler - Version 设置下方将 Use Legacy Swift Language Version (使用传统 Swift 语言版本) 属性设置为

    要通过显式下载Amazon移动软件开发工具包或使用 Carthage,将 Swift 中的Amazon移动版 SDK for iOS 导入您的项目中,请按照开发工具包随附的 README.md 文件中的说明操作。确保只使用以下选项之一来导入 Amazon 移动开发工具包。

在 Swift 项目中通过 API Gateway 生成的 iOS 开发工具包调用 API 方法

当您为此 SimpleCalc API 生成具有 SIMPLE_CALC 前缀的开发工具包,并通过两个模型描述 API 请求和响应的输入 (Input) 和输出 (Result) 时,在开发工具包中,由此产生的 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 结合使用,请设置默认 Amazon 服务配置(如下所示),然后再获取 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 }

    其中,帮助程序函数 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 编码的路径变量。