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

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

  • 处理登录按钮并获取用户配置文件数据
  • 获取用户配置文件数据
  • 启动时检查用户登录
  • 清除授权数据并注销用户
  • 下载最新版本适用于iOS的 亚马逊应用和游戏服务SDK
  • 将文件解压缩到硬盘上的目录中。
  • 更新库和框架,然后构建项目(如需更多详细说明,请参阅 创建Login with Amazon项目 ):
  • 如果您使用了Login with Amazon 1.0或2.0库,请从 Frameworks 文件夹中删除 login-with-amazon-sdk 目录以及 login-with-amazonsdk.a 。在主菜单中单击 Edit (编辑),然后选择 Delete (删除)。此外,如果您的项目使用的是旧版本 LoginWithAmazon.framework ,请删除对旧版本的任何引用。
  • 在Xcode中打开项目后,选择 Frameworks 文件夹,从主菜单中单击 File (文件),然后选择 Add files to <项目> 。在对话框中,选择 LoginWithAmazon.framework (v3.0.x) ,然后单击 Add (添加)。
  • 在项目的 Build Phases (构建阶段)部分,展开 Link Binary with Libraries (将二进制文件与库关联),然后单击加号将以下框架添加到您的项目中: Security.framework SafariServices.framework CoreGraphics.framework
  • 选择 Build Settings (构建设置),然后单击 All (全部)。确保 LoginWithAmazon.framework 目录位于 Framework搜索路径 中。如果您使用了Login with Amazon 1.0或2.0库,则可以在 标题搜索路径 库搜索路径 中删除对1.0或2.0库路径的任何引用。
  • 在主菜单中,单击 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标头。
  • 按照以下说明迁移到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 对象。
  • 或者,您可以使用 AMZNScopeFactory 创建 AMZNScope 对象:

    [AMZNScopeFactory scopeWithName:@"profile"]
        

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

    使用块对象来处理回调。

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

    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的类参考。
  • userDidCancel: 如果客户选择在登录流程中取消,则布尔标记设置为true。
  • 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类,以帮助您更好地管理客户配置文件数据。一些常用的客户配置文件数据被定义为此类中的属性:

  • userID:客户的唯一标识符。
  • name:客户的姓名。
  • email:客户的电子邮件地址。
  • postalCode:客户的邮政编码。
  • profileData: 包含客户所有可用个人资料数据的字典。
  • 新的适用于iOS的LWA SDK为您提供了两个请求客户配置文件数据的新选项,它们取代了对之前版本SDK要求的getProfile: API的调用:

  • 当客户未登录您的应用时,调用authorize:withHandler:以在您的AMZNAuthorizationRequestHandler块的result对象中检索AMZNUser对象。
  • 如果客户当前已登录您的应用,请调用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授权服务器出错。
          
    amazon_developer_logo

    © 2010-2026 年,亚马逊公司或其附属公司. 保留所有权利。