使用适用于iOS API的Login with Amazon SDK
连接AppDelegate
在处理UIApplicationDelegate协议的项目类中,实现application:openURL:options:。此类默认为AppDelegate类。用户使用Login with Amazon成功登录到您的应用后,将基于之前在属性列表中添加的URL方案,从亚马逊登录界面重定向返回应用。为了处理此重定向,必须实现application:openURL:options:方法,如果URL成功处理,将返回YES。
适用于iOS的Login with Amazon SDK提供库功能,即handleOpenURL:sourceApplication:,可处理亚马逊页面发送的任何重定向URL。如果SDK成功处理URL,将返回YES。在应用程application:openURL:options:方法中调用此方法。
要引用此方法,需要导入<LoginWithAmazon/LoginWithAmazon.h>。
import <LoginWithAmazon/LoginWithAmazon.h>
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)
url options:(NSDictionary<uiapplicationopenurloptionskey,id> *)options {
return [AMZNAuthorizationManager handleOpenURL:url
sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]];
}
@end
处理登录按钮并获取个人资料数据
本部分介绍了如何调用authorize:withHandler: API来登录用户。这包括为Login with Amazon按钮创建onLoginButtonClicked:侦听器。
-
为iOS项目添加Login with Amazon。如需了解具体说明,请参阅创建Login with Amazon项目。
-
将Login with Amazon API导入到源文件。
要导入Login with Amazon API,需要为源文件添加以下#import语句:
#import <LoginWithAmazon/LoginWithAmazon.h> -
调用
onLoginButtonClicked中的authorize:withHandler:。如果您按照为应用添加Login with Amazon按钮中的步骤操作,则
onLoginButtonClicked:方法应链接到Login with Amazon按钮。在此方法中,调用authorize:withHandler:来提示用户登录并授权应用。此方法将使用以下其中一种方式来实现用户登录并同意请求信息:
- 切换到安全环境下的网页视图(适用于已安装亚马逊购物应用的设备)
- 切换到Safari视图控制器(适用于iOS 9及更高版本)
- 切换到系统浏览器(iOS 8及更低版本)
如果设备已安装马逊购物应用,可实现第一个选项中的安全环境。如果用户已登录到亚马逊购物应用,此API将跳过登录页面,提供单点登录(SSO)体验。请参阅iOS应用中的客户体验以了解更多信息。
authorize:withHandler:的第一个参数为包含应用授权请求范围的AMZNAuthorizeRequest对象。包含向Login with Amazon请求的用户数据的范围。用户首次登录您的应用时,将看到您请求的数据列表并会询问是否批准。Login with Amazon当前支持的范围如下:
profile(访问用户的名称、电子邮件地址和亚马逊账户ID)、profile:user_id(仅访问用户的亚马逊账户ID)和postal_code(访问用户保存在亚马逊账户文件中的邮政编码)。使用
AMZNProfileScope中定义的方法来获取范围对象,并将其添加到AMZNAuthorizeRequest对象。请参阅以下示例代码了解详细信息。authorize:withHandler:的第二个参数为AMZNAuthorizationRequestHandler,详见下一步骤。 -
创建
AMZNAuthorizationRequestHandler块对象。AMZNAuthorizationRequestHandler将处理authorize:withHandler:调用的结果。要了解更多有关objective-c数据块的信息,请参阅developer.apple.com中的Working with Blocks。AMZNAuthorizationRequestHandler的第一个参数为AMZNAuthorizeResult对象。用户授权成功后,AMZNAuthorizeResult将可用于访问用户个人资料数据的访问令牌访问令牌和包含用户个人资料数据的AMZNUser对象。AMZNAuthorizationRequestHandler的第二个参数为布尔值,称为userDidcancel。此参数设置为true的情况有以下几种:- 用户在登录授权期间关闭了Safari视图控制器(iOS 9及更高版本)
- 用户在亚马逊购物应用的网页视图中,关闭了登录或同意界面。同意界面。
- 取消登录或拒绝授权
AMZNAuthorizationRequestHandler的第三个参数为NSError对象,如果登录授权因SDK或授权服务器错误而失败,其中将包含详细的错误信息。- (IBAction)onLogInButtonClicked:(id)sender { // 构建一项授权请求。 AMZNAuthorizeRequest *request = [[AMZNAuthorizeRequest alloc] init]; request.scopes = [NSArray arrayWithObjects: // [AMZNProfileScope userID], [AMZNProfileScope profile], [AMZNProfileScope postalCode]]; // 向Login with Amazon SDK请求授权调用。 [[AMZNAuthorizationManager sharedManager] authorize:request withHandler:^(AMZNAuthorizeResult *result, BOOL userDidCancel, NSError *error) { if (error) { // 处理SDK或授权服务器的错误。 } else if (userDidCancel) { // 处理用户取消登录导致的错误。 } else { // 身份验证成功。 // 获取访问令牌和用户个人资料数据。 NSString *accessToken = result.token; AMZNUser *user = result.user; NSString *userID = user.userID; } }]; }
获取用户个人资料数据
只要用户登录并授权您的应用,您可以随时获取他们的个人资料数据。本部分介绍了如何使用AMZNUser类的fetch:方法来检索当前授权用户最新的个人资料数据。您可以检索的个人资料数据取决于authorize调用中指示的范围。
-
调用
AMZNUser fetch:。此方法将通过
AMZNUserFetchRequestHandler块对象获取个人资料数据。AMZNUserRequestHandler的第一个参数为AMZNUser对象。AMZNUser对象将根据所请求的范围,可能会包含userID、name、email和postalCode等信息。[AMZNUser fetch:^(AMZNUser *user, NSError *error) { if (error) { // SDK错误,或者没有用户授权此应用。 } else if (user) { NSString *userID = user.userID; //NSString *name = user.name; //NSString *email = user.email; //NSString *postalCode = user.postalCode; } }];
检查首次登录的用户
如果用户登录并关闭您的应用,并在之后重新启动,应用仍然有权检索数据。用户不会自动注销。如果您的应用仍处于授权状态,可在启动时将用户显示为已登录。本部分介绍了如何使用authorize:withHandler:来确定应用是否仍处于授权状态。
-
创建
AMZNAuthorizeRequest对象并指定应用请求授权的用户数据范围。有关范围的更多信息,请参阅上文处理登录按钮并获取个人资料数据。 -
为
AMZNInteractiveStrategyNever设置为用户登录提示提供多种支持策略:AMZNAuthorizeRequest.interactiveStrategy。AMZNAuthorizeRequestAMZNInteractiveStrategyAuto(默认): SDK将从之前的authorize:withHandler:响应中查找本地存储的授权授予。授权授予。如果存在一个可用、有效且包含所有请求范围的授权授予,SDK将通过AMZNAuthorizationRequestHandler返回成功的响应,且不会提示用户进行登录。否则,系统将提示用户登录。AMZNInteractiveStrategyAlways:无论用户之前是否已获权使用应用,SDK将始终提示用户登录。用户收到提示后,SDK将删除所有本地缓存的应用授权授予。AMZNInteractiveStrategyNever:SDK将从之前的authorize:withHandler响应中查找本地存储的授权授予。如果存在一个可用、有效且包含所有请求范围的授权授予,SDK将返回包含访问令牌和用户个人资料数据的AMZNAuthorizeResult对象。否则,将通过AMZNAuthorizationRequestHandler返回NSError对象。
// 构建一项授权请求。 AMZNAuthorizeRequest *request = [[AMZNAuthorizeRequest alloc] init]; request.scopes = [NSArray arrayWithObjects: // [AMZNProfileScope userID], [AMZNProfileScope profile], [AMZNProfileScope postalCode]]; request.interactiveStrategy = AMZNInteractiveStrategyNever; [[AMZNAuthorizationManager sharedManager] authorize:request withHandler:^(AMZNAuthorizeResult *result, BOOL userDidCancel, NSError *error) { if (error) { // SDK错误,说明用户之前并未向应用授权所请求的范围。 } else { // 用户之前已授权您的应用。 // 获取访问令牌和用户个人资料数据。 NSString *accessToken = result.token; AMZNUser *user = result.user; NSString *userID = user.userID; } }];
清除授权数据并注销用户
本部分介绍了如何使用signOut方法来清除AMZNMobileLib(在适用于iOS的Login with Amazon 3.1.0版本中,AIMobileLib已更名为AMZNMobileLib)本地存储和授权服务器中的用户授权数据。应用若要检索个人资料数据,用户必须重新进行登录。使用此方法可注销用户,也可以对应用中的登录问题进行故障排除。
-
实现注销机制。
用户成功登录后,您应提供注销机制,以便用户清除个人资料数据和以前的授权范围。这项机制可以是超链接,也可以是按钮或菜单项。
-
调用
signOut:。在注销程序处理中调用
signOut:来删除本地存储和服务器身份验证状态中的用户授权数据(访问令牌和个人资料)。signOut的输入参数为AMZNAuthorizationRequestHandler块对象。如果signOut:失败,此块将检测并处理返回的NSError对象。[[AMZNAuthorizationManager sharedManager] signOut:^(NSError * _Nullable error) { if (!error) { // 来自SDK或Login with Amazon授权服务器的错误。 } }];
测试集成
在iOS设备或模拟器中启动您的应用,并确认您可以使用Amazon.com的凭证进行登录。
authorizeUserForScopes请求的错误消息APIKey for the Application is invalid(此应用的APIKey无效),或是关于clearAuthorizationState请求的错误消息Unknown Error Code(未知错误代码)。这是苹果系统中的已知错误,见于SDK尝试访问密钥链的情况。在苹果解决此错误之前,您可以在应用目标的Capabilities(功能)选项卡下为应用启用Keychain Sharing(密钥链分享)来实现变通。此错误仅影响模拟器。在实际的iOS10设备中测试时无需使用变通方法。
