as

Settings
Sign out
Notifications
Alexa
亚马逊应用商店
AWS
文档
Support
Contact Us
My Cases

适用于iOS的Login with Amazon SDK 3.0.x迁移指南

适用于iOS的Login with Amazon SDK 3.0.x迁移指南

本指南介绍如何将您的应用从使用适用于iOS的Login with Amazon SDK v2.1.2(或更低版本)迁移到使用适用于iOS的Login with Amazon SDK v3.0.x。您需要从使用AIMobileLib类下的API迁移到使用AMZNAuthorizationManagerAMZNUser下的新API。

如果您尚未将Login with Amazon集成到您的应用中,请查看iOS开始使用指南中的全套说明。

升级方法

  1. 下载最新版本适用于iOS的亚马逊应用和游戏服务SDK
  2. 将文件解压缩到硬盘上的目录中。
  3. 更新库和框架,然后构建项目(如需更多详细说明,请参阅创建Login with Amazon项目):
    1. 如果您使用了Login with Amazon 1.0或2.0库,请从Frameworks文件夹中删除login-with-amazon-sdk目录以及login-with-amazonsdk.a。在主菜单中单击Edit(编辑),然后选择Delete(删除)。此外,如果您的项目使用的是旧版本LoginWithAmazon.framework,请删除对旧版本的任何引用。
    2. 在Xcode中打开项目后,选择Frameworks文件夹,从主菜单中单击File(文件),然后选择Add files to <项目>。在对话框中,选择LoginWithAmazon.framework (v3.0.x),然后单击Add(添加)。
    3. 在项目的Build Phases(构建阶段)部分,展开Link Binary with Libraries(将二进制文件与库关联),然后单击加号将以下框架添加到您的项目中: Security.frameworkSafariServices.frameworkCoreGraphics.framework
    4. 选择Build Settings(构建设置),然后单击All(全部)。确保LoginWithAmazon.framework目录位于Framework搜索路径中。如果您使用了Login with Amazon 1.0或2.0库,则可以在标题搜索路径库搜索路径中删除对1.0或2.0库路径的任何引用。
    5. 在主菜单中,单击Product(产品),然后选择Build(构建)。构建应成功完成。在构建项目之前,如果您使用了Login with Amazon 1.0或2.0库,请将源文件中的#import "AIMobileLib.h"#import "AIAuthenticationDelegate.h"#import "AIError.h"替换为#import <LoginWithAmazon/LoginWithAmazon.h>。 LoginWithAmazon.h同时包含所有Login with Amazon标头。
  4. 按照以下说明迁移到Login with Amazon 3.0库中引入的新API。

处理登录按钮并获取用户配置文件数据

调用authorize:withHandler方法。

在新的适用于iOS的LWA SDK中,不要调用authorizeUserForScopes:delegate:options:,而是改为调用authorize:withHandler:。要调用这个新的API,您需要定义一个AMZNAuthorizeRequest对象。此请求对象让您可以将输入参数自定义为authorize:withHandler: API。通常传递给AMZNAuthorizeRequest类的一些属性包括:

  • scopes: 定义请求授权的范围。AMZNProfileScope类定义Login with Amazon提供的范围。如果您将API用于其他亚马逊产品,则会发现这些产品支持的范围包含在它们自己的文档中。
  • interactiveStrategy: 这是一个新定义的属性,用于确定在调用authorize:withHandler:时是否提示用户登录。LWA SDK目前支持以下策略来提示用户登录:
    • AMZNInteractiveStrategyAuto(默认): SDK从之前的authorize:withHandler:响应中查找本地存储的授权授予。如果有授权授予可用、有效且包含所有请求的范围,则SDK将通过AMZNAuthorizationRequestHandler返回成功的响应,并且不会提示用户登录。否则,将提示用户登录。
    • AMZNInteractiveStrategyAlways: 无论用户之前是否已获得使用应用的授权,SDK始终都将提示用户登录。当系统提示用户时,SDK将删除该应用的所有本地缓存的授权授予。
    • AMZNInteractiveStrategyNever: SDK会从之前的authorize:withHandler响应中寻找本地存储的授权授予。如果有授权授予可用、有效且包含所有请求的范围,SDK将返回一个AMZNAuthorizeResult对象,其中包含访问令牌和用户配置文件数据。否则,它将通过AMZNAuthorizationRequestHandler返回NSError对象。

有关AMZNAuthorizeRequest对象中属性的完整列表,请参阅SDK文档中的类参考。

向AMZNAuthorizeRequest添加范围。

在新的适用于iOS的LWA SDK中,我们使用AMZNScope对象来表示范围。要请求范围,您需要将AMZNScope对象添加到您的AMZNAuthorizeRequest中。有两个选项:

  • 要请求Login with Amazon提供的客户配置文件范围,请使用AMZNProfileScope类中定义的方法:

    范围名称 AMZNProfileScope类中的方法
    profile [AMZNProfileScope profile]
    postal_code [AMZNProfileScope postalCode]
    profile:user_id [AMZNProfileScope userID]
  • 或者,您可以使用AMZNScopeFactory创建AMZNScope对象:

    [AMZNScopeFactory scopeWithName:@"profile"]
    

    使用此替代方法请求其他亚马逊产品提供的范围。

使用块对象来处理回调。

适用于iOS的新LWA SDK改为使用objective-c块对象来处理回调函数,而不是使用委托方法。此更改无需实现两种委托方法(一种用于requestDidSucceed:,另一种用于requestDidFail:)。可以改为调用单个AMZNAuthorizationRequestHandler块对象来处理authorize:withHandler:调用的结果。AMZNAuthorizationRequestHandler块包含三个参数:

  1. resultAMZNAuthorizeResult对象,其中包含authorize:withHandler:调用成功时来自Login with Amazon授权服务器的响应。result可能包括:

    • token: 如果您请求访问令牌(默认情况下出现),LWA授权服务器将在result对象中返回访问令牌。您不再需要通过单独调用getAccessTokenForScopes:withOverrideParams:delegate: API来请求访问令牌,即不需要在authorizeUserForScopes:delegate: API的成功委托方法中进行该单独调用(先前版本的适用于iOS的LWA SDK中的一项要求)。
    • user: 如果您请求profile范围,则result对象将包含一个AMZNUser对象,其中包含所请求的客户配置文件数据。您不再需要从authorizeUserForScopes:delegate:的成功委托方法调用getProfile:(先前版本的适用于iOS的LWA SDK中的一项要求)。有关获取配置文件数据的更多信息,请参阅AMZNUser的类参考。
  2. userDidCancel: 如果客户选择在登录流程中取消,则布尔标记设置为true。
  3. error: 处理authorize:withHandler:请求期间,适用于iOS的LWA SDK中出现内部错误时返回一个NSError对象。

    	- (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;
    			  }
    	  }];
    	}
    

获取用户配置文件数据

只要用户登录并已对您的应用授权,您就可以随时获取其用户配置文件数据。新的适用于iOS的LWA SDK引入了AMZNUser类,以帮助您更好地管理客户配置文件数据。一些常用的客户配置文件数据被定义为此类中的属性:

  1. userID:客户的唯一标识符。
  2. name:客户的姓名。
  3. email:客户的电子邮件地址。
  4. postalCode:客户的邮政编码。
  5. profileData: 包含客户所有可用个人资料数据的字典。

新的适用于iOS的LWA SDK为您提供了两个请求客户配置文件数据的新选项,它们取代了对之前版本SDK要求的getProfile: API的调用:

  1. 当客户未登录您的应用时,调用authorize:withHandler:以在您的AMZNAuthorizationRequestHandler块的result对象中检索AMZNUser对象。
  2. 如果客户当前已登录您的应用,请调用fetch: API(在AMZNUser类中),以获取最新的客户配置文件数据。

    	[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;
    
    		// 获取字典中所有可用的用户配置文件数据
    		NSDictionary *profileData = user.profileData
    	  }
    	}];
    

启动时检查用户登录

在新的适用于iOS的LWA SDK中,您不再需要调用getAccessTokenForScopes:withOverrideParams:delegate:。可以改为调用authorize:withHandler: API来检测您的应用是否仍处于已获授权状态。将AMZNAuthorizeRequest.interactiveStrategy设置为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;
    }
}];

清除授权数据并注销用户

使用新的适用于iOS的LWA SDK提供的新signOut: API,它取代了clearAuthorizationState:

[[AMZNAuthorizationManager sharedManager] signOut:^(NSError * _Nullable error) {
  if (!error) {
	// SDK或Login with Amazon授权服务器出错。
  }
}];