本指南介绍如何将您的应用从使用适用于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块包含三个参数:
result: AMZNAuthorizeResult对象,其中包含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: 包含客户所有可用个人资料数据的字典。
注意: 要获取该客户数据,您首先需要对上述一个或多个profile范围申请授权。
新的适用于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授权服务器出错。

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