本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用生成的 iOS 开发工具包 (Swift) 来调用 API
在开始以下过程之前,您必须完成 使用 API Gateway 控制台为 API 生成开发工具包 中适用于 Swift 版 iOS 的步骤,并下载已生成的开发工具包的 .zip 文件。
主题
在 Swift 项目中安装 Amazon 移动开发工具包和 API Gateway 生成的开发工具包
以下过程将介绍如何安装开发工具包。
安装并使用 API Gateway 生成的 Swift 版 iOS 开发工具包
-
提取您之前下载的 API Gateway 生成的 .zip 文件中的内容。使用 SimpleCalc API,您可能需要将解压的软件开发工具包文件夹重命名为类似
sdk_swift_simple_calc
的名字。此开发工具包文件夹中有一个README.md
文件和一个Podfile
文件。README.md
文件包含介绍如何安装和使用开发工具包的说明。本教程将提供有关这些说明的详细信息。安装过程会利用 CocoaPods导入必需的 Amazon 移动开发工具包组件。您必须更新 Podfile
,才能将开发工具包导入 Swift 应用程序的 Xcode 项目中。解档开发工具包文件夹还包含一个generated-src
文件夹,其中包含 API 已生成开发工具包的源代码。 -
启动 Xcode,并创建一个新的 iOS Swift 项目。请记下该项目的目标。您需要在
Podfile
中对其进行设置。 -
要使用 CocoaPods 将必需的 Amazon 移动开发工具包组件导入 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 组件及任何依赖的 Amazon 移动开发工具包组件安装到应用程序的项目中。
-
关闭 Xcode 项目,然后打开
*.xcworkspace
文件,以重新启动 Xcode。 -
将已提取
.h
目录中所有开发工具包的标头文件 (.swift
) 和 Swift 源代码文件 (generated-src
) 添加到您的 Xcode 项目中。 -
为了能够从 Swift 代码项目调用 Amazon 移动开发工具包的 Objective-C 库,请在 Xcode 项目配置的
Bridging_Header.h
Swift Compiler - General 设置下,在 Objective-C Bridging Header 属性上设置 文件路径:提示
您可以通过在 Xcode 的搜索框中键入
bridging
来找到 Objective-C Bridging Header 属性。 -
构建 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_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 结合使用,请设置默认 Amazon 服务配置(如下所示),然后再获取
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 }
其中,帮助程序函数
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 编码的路径变量。