iOS用のLogin with Amazon SDK 3.0.xへの移行ガイド
このガイドでは、アプリで使用しているiOS用のLogin with Amazon SDKをv2.1.2(またはそれ以下)からv3.0.xに移行する方法について説明します。AIMobileLib
クラスのAPIから、AMZNAuthorizationManager
またはAMZNUser
の新しいAPIを使用するように移行する必要があります。
アプリとLogin with Amazonをまだ統合していない場合は、iOSのスタートガイドの一連の手順を参照してください。
アップグレードの方法
- 最新バージョンのiOS用Amazonアプリ・ゲームサービス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 Search Paths] にあることを確認します。Login with Amazon 1.0または2.0ライブラリを使用していた場合は、[Header Search Paths] や [Library Search Paths] で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で提供されるscopeを定義します。そのほかのAmazon製品のAPIを使用している場合、サポート対象のscopeについては各製品のドキュメントでご確認ください。interactiveStrategy
: 新たに定義されたプロパティで、authorize:withHandler:
が呼び出されたときにユーザーにサインインするよう促すかどうかを決定します。LWA SDKは現在、ユーザーにサインインを促す戦略として以下をサポートしています。AMZNInteractiveStrategyAuto
(デフォルト): SDKは、過去のauthorize:withHandler:
レスポンスからローカルに保存された認可グラントを探します。リクエストされたスコープをすべて含む有効な認可グラントがあれば、SDKはAMZNAuthorizationRequestHandler
を通じて成功のレスポンスを返します。ユーザーにログインを促す画面は表示しません。有効な認可グラントがない場合は、ユーザーにログインを促します。AMZNInteractiveStrategyAlways
: 過去にアプリの使用が許可されているかどうかにかかわらず、常にユーザーにログインを促します。ユーザーにログインを促す際に、SDKはローカルにキャッシュされているアプリの認可グラントをすべて削除します。AMZNInteractiveStrategyNever
: SDKはローカルに保存された認可グラントがあるかどうかを過去のauthorize:withHandler
レスポンスから探します。リクエストされたスコープをすべて含む有効な認可グラントがあれば、SDKはAMZNAuthorizeResult
オブジェクトを返します。このオブジェクトには、アクセストークンとユーザープロファイルデータが含まれます。有効な認可グラントがない場合は、AMZNAuthorizationRequestHandler
を通じてNSError
オブジェクトを返します。
AMZNAuthorizeRequest
オブジェクトのプロパティ一覧については、SDKドキュメント内のクラスリファレンスを参照してください。
AMZNAuthorizeRequestにscopeを追加します。
iOS用の新しいLWA SDKでは、scopeを表すためにAMZNScope
オブジェクトを使用します。スコープをリクエストするには、AMZNAuthorizeRequest
にAMZNScope
オブジェクトを追加する必要があります。これには2つの方法があります。
-
Login with Amazonから提供されるユーザープロファイルスコープをリクエストするには、
AMZNProfileScope
クラスに定義されているメソッドを使用します。scope名 AMZNProfileScopeクラスのメソッド profile [AMZNProfileScope profile] postal_code [AMZNProfileScope postalCode] profile:user_id [AMZNProfileScope userID] -
もう1つの方法として、次のように
AMZNScopeFactory
を使用してAMZNScope
オブジェクトを作成できます。[AMZNScopeFactory scopeWithName:@"profile"]
このメソッドを使用して、そのほかのAmazon製品に提供されるscopeをリクエストできます。
ブロックオブジェクトを使用してコールバックを処理します。
iOS用の新しいLWA SDKでは、delegateメソッドを使用する代わりに、Objective-Cブロックオブジェクトを使用してコールバック関数を処理します。この変更により、2つのデリゲートメソッド(1つはrequestDidSucceed:
用、もう1つはrequestDidFail:
用)の実装が不要になります。代わりに、AMZNAuthorizationRequestHandler
ブロックオブジェクトを1つ実装してauthorize:withHandler:
の呼び出しの結果を処理します。AMZNAuthorizationRequestHandler
ブロックには、次の3つの引数が含まれます。
-
result
:authorize:withHandler:
の呼び出しが成功した場合にLogin with Amazon認可サーバーからのレスポンスを含むAMZNAuthorizeResult
オブジェクト。result
には次のような値が入ります。token
: アクセストークンをリクエストした場合(デフォルトの処理)、LWA認可サーバーはアクセストークンをresult
オブジェクトに返します。トークンをリクエストするために、getAccessTokenForScopes:withOverrideParams:delegate:
APIをauthorizeUserForScopes:delegate:
APIの成功delegateメソッドで別途呼び出す必要はありません(iOS用の以前のバージョンのLWA SDKでは必要でした)。user
:profile
スコープをリクエストした場合、result
オブジェクトに、リクエストしたプロファイルデータを含むAMZNUser
オブジェクトが格納されます。getProfile:
をauthorizeUserForScopes:delegate:
の成功時のデリゲートメソッドから呼び出す必要はありません(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
:ユーザーのEメールアドレス。postalCode
:ユーザーの郵便番号。profileData
: ユーザーから提示されているプロファイルデータをすべて含む辞書。
profile
scopeに対して1つ以上の認可リクエストを行う必要があります。iOS用の新しいLWA SDKでは、新たに2つの方法でユーザープロファイルデータをリクエストでき、以前の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認可サーバーからのエラー。
}
}];