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