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認可サーバーからのエラー。
  }
}];

