iOS 3.0.x用のLogin with Amazon SDKへの移行ガイド

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のスタートガイドの一連の手順を参照してください。

アップグレードの方法

  1. Amazon Developer SDK(iOS用)の最新バージョンをダウンロードします。
  2. ハードドライブのディレクトリにファイルを展開します。
  3. ライブラリとフレームワークをアップデートし、プロジェクトをビルドします(手順の詳細については、Login with Amazonプロジェクトを作成するを参照してください)。
    1. Login with Amazon 1.0または2.0ライブラリを使用していた場合は、Frameworksフォルダからlogin-with-amazon-sdkディレクトリとlogin-with-amazonsdk.aを削除します。メインメニューで [Edit][Delete] の順に選択します。プロジェクトで古いバージョンのLoginWithAmazon.frameworkを使用していた場合は、その参照も削除します。
    2. Xcodeでプロジェクトを開きます。Frameworksフォルダを選択してメインメニューの [File] をクリックし、[Add files to <プロジェクト>] を選択します。ダイアログで、[LoginWithAmazon.framework (v3.0.x)] を選択し、[Add] をクリックします。
    3. プロジェクトの [Build Phases] セクションで、[Link Binary with Libraries] を展開します。[+] 記号をクリックし、プロジェクトにフレームワーク (Security.frameworkSafariServices.frameworkCoreGraphics.framework)を追加します。
    4. [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ライブラリパスへの参照をすべて削除できます。
    5. メインメニューで [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のすべてのヘッダーが含まれています。
  4. 次の手順に従って、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つの引数が含まれます。

  1. resultauthorize:withHandler:の呼び出しが成功したときのLogin with Amazon認可サーバーからのレスポンスが含まれるAMZNAuthorizeResultオブジェクト。resultには次のような値が入ります。

    • token: アクセストークンをリクエストした場合(デフォルトの処理)、LWA認可サーバーはアクセストークンをresultオブジェクトに返します。トークンをリクエストするために、getAccessTokenForScopes:withOverrideParams:delegate: APIをauthorizeUserForScopes:delegate: APIの成功delegateメソッドで別途呼び出す必要はありません(iOS用の以前のバージョンのLWA SDKでは必要でした)。
    • userprofileスコープをリクエストした場合、リクエストされたユーザープロファイルデータが含まれるAMZNUserオブジェクトがresultオブジェクトに返されます。getProfile:authorizeUserForScopes:delegate:の成功delegateメソッドから呼び出す必要はありません(iOS用の以前のバージョンのLWA SDKでは必要でした)。プロファイルデータの取得に関する詳細については、AMZNUserのクラスリファレンスを参照してください。
  2. userDidCancel: ユーザーがログインフロー中にキャンセルを選択する場合、ブーリアンフラグは「true」に設定されます。
  3. errorauthorize: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クラスが導入されています。よく使用されるユーザープロファイルデータの一部は、このクラスのプロパティとして定義されています。

  1. userID:ユーザーの一意の識別子。
  2. name:ユーザーの名前。
  3. email:ユーザーのEメールアドレス。
  4. postalCode:ユーザーの郵便番号。
  5. profileData: ユーザーから提示されているプロファイルデータをすべて含む辞書。

iOS用の新しいLWA SDKでは、新たに2つの方法でユーザープロファイルデータをリクエストできます。これらは、以前のSDKバージョンでは必須であったgetProfile: APIの呼び出しに代わる機能となります。

  1. ユーザーがアプリにサインインしていないときは、authorize:withHandler:を呼び出してAMZNAuthorizationRequestHandlerブロックのresultオブジェクトにあるAMZNUserオブジェクトを取得します。
  2. ユーザーがアプリにサインインしている場合は、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.interactiveStrategyAMZNInteractiveStrategyNeverに設定し、ローカルに保存された認可グラントがあるかどうかを過去の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認可サーバーからのエラー。
  }
}];