本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用生成的 iOS 开发工具包 (Objective-C) 来调用 API
在开始以下过程之前,您必须完成使用 API Gateway 控制台为 API 生成开发工具包中适用于 Objective-C 版 iOS 的步骤,并下载已生成的开发工具包的 .zip 文件。
在 Objective-C 项目中安装Amazon移动开发工具包和 API Gateway 生成的 iOS 开发工具包
以下过程将介绍如何安装开发工具包。
安装并使用 API Gateway 生成的 Objective-C 版 iOS 开发工具包
-
提取您之前下载的 API Gateway 生成的 .zip 文件中的内容。使用 SimpleCalc API,您可能需要将解压的软件开发工具包文件夹重命名为类似
sdk_objc_simple_calc
的名字。此开发工具包文件夹中有一个README.md
文件和一个Podfile
文件。README.md
文件包含介绍如何安装和使用开发工具包的说明。本教程将提供有关这些说明的详细信息。安装过程会利用 CocoaPods导入必需的 API Gateway 库和其他依赖的Amazon移动开发工具包组件。您必须更新 Podfile
,才能将开发工具包导入应用程序的 Xcode 项目中。解档开发工具包文件夹还包含一个generated-src
文件夹,其中包含 API 已生成开发工具包的源代码。 -
启动 Xcode,并创建一个新的 iOS Objective-C 项目。请记下该项目的目标。您需要在
Podfile
中对其进行设置。 -
要使用 CocoaPods 将 Amazon 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 组件和其他依赖的Amazon移动开发工具包组件。
-
关闭 Xcode 项目,然后打开
.xcworkspace
文件,以重新启动 Xcode。 -
将已提取开发工具包的
.h
目录中的所有.m
和generated-src
文件添加到 Xcode 项目中。
要通过显式下载 Amazon Mobile SDK for iOS 移动开发工具包或使用 AmazonCarthage 的方式将
Objective-C 导入您的项目中,请遵循 README.md 文件中的说明。确保只使用以下选项之一来导入 Amazon 移动开发工具包。 -
在 Objective-C 项目中使用 API Gateway 生成的 iOS 开发工具包调用 API 方法
当您为此 SimpleCalc API 生成具有 SIMPLE_CALC
前缀的开发工具包,并将两个模型用于方法的输入 (Input
) 和输出 (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 结合使用,请在默认的
defaultServiceConfiguration
对象上设置AWSServiceManager
属性(如下所示),然后再调用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 编码的路径变量。