updateStatusメソッドとhandleReadStatusコールバック関数が含まれています。updateStatusメソッドは、認証状態が変更されたときに、アプリの現在のログインステータスを報告してリアルタイムで更新します。handleReadStatusコールバック関数は、アプリの現在のログインステータスに関するシステムからの照会に応答します。どちらのメソッドでも、アカウントステータスを表すにはStatusTypeが使用されます。これは、SIGNED_INとSIGNED_OUTの2つの値になる可能性があります。
VegaメディアアカウントログインAPIのリファレンス
このAPIに関するリファレンスドキュメントについては、アカウントログインAPIを参照してください。Vegaメディアアカウントログインの一般的なユースケース
アプリでは、次の場合にシステムにログインステータスの更新を送信する必要があります。- アプリが最初に起動したとき。
- ユーザーの定期購入のステータスが変更されたとき。
- ほかのサービスからリクエストされたとき。
Vegaメディアアカウントログインのインストールとセットアップ
手順1:アプリのマニフェストを更新する
アカウントログインの操作の一部は、サービスコンポーネントを使用して処理します。サービスコンポーネントについての理解を深めてください。これはヘッドレスコンポーネントとも呼ばれます。対話型コンポーネントと並行してサービスを動作させることで、この統合の実行とトラブルシューティングが容易になります。サービスコンポーネントのドキュメントを参照してください。 まず、アプリのマニフェストを更新して、VegaメディアアカウントログインAPIを使用するように設定します。マニフェストエントリを変更するときは、以下の例に含まれているcom.amazondeveloper.media.sampleを、アプリの実際のパッケージIDに置き換えてください。ほとんどの場合、開発者は、アカウントログインAPIを、アカウントログインステータスを提供するサービスとして実装します。これは特に、読み取り操作中に使用されます。ユーザーに対話型インターフェイスベースのアプリを開くことを要求しないでください。開発者は通常、メディアプロバイダーアプリを、ユーザーインターフェイスを処理する対話型アプリとして実装します。対話型アプリとサービスアプリは、アカウントログイン情報を互いに交換する必要があります。アカウントログイン情報の交換には、共有ファイルやその他のプロセス間通信メカニズムを使用できます。
以下の例は、コンテンツランチャーAPIとアカウントログインAPIの両方を使用するマニフェストのサンプルです。ここでは、対話型コンポーネントとサービスコンポーネントの両方を定義しています。
- コンテンツランチャークラスターAPI。コンテンツを検索して起動するために使用します。
- VegaメディアコントロールAPI。起動したメディアを制御するために使用します。
- アカウントログインAPI。アカウントログインステータスをシステムに伝達するために使用します。
interface.providerキーを使用して指定します。
手順2:パッケージの依存関係を追加する
VegaメディアアカウントログインAPIは、システムターボモジュールであるamzn/kepler-media-account-loginを使用してTypeScript開発者に提供されます。このターボモジュールはSDKパッケージの一部です。APIを使用するには、ターボモジュールを依存関係として取り込むようにpackage.jsonを更新し、amzn/headless-task-managerを使用してヘッドレスサービスアプリを作成します。
手順3:Vegaメディアアカウントログインのビジネスロジックを追加する
AccountLoginWrapper.tsという名前のファイルを作成して、VegaメディアアカウントログインAPIのコアビジネスロジックを含めます。このファイルで、AccountLoginWrapperという名前のクラスを作成してエクスポートします。このクラスには、アカウントログインサーバーとのやり取りに使用される、IAccountLoginServerAsyncインターフェイスのインスタンスを表すメンバー変数を1つ含めます。さらにこのファイルでは、AccountLoginServerComponentのインスタンスをグローバルに作成し、それをaccountLoginServerComponentという名前の変数に格納します。
手順4:アカウントログインステータスを非同期に返す
ここで、IAccountLoginHandlerAsyncを使用してhandleReadStatus()メソッドを実装します。このメソッドは引数を持たず、Promise<IStatus>を返します。メソッドをこのように設計すると、サービスアプリからアカウントログインステータスが非同期に返されるため、呼び出し元はブロックされません。Promise<IStatus>戻り型は、このメソッドが最終的にIStatusオブジェクトで解決されることを示します。このオブジェクトには、現在のログイン状態に関する情報が含まれている可能性があります。handleReadStatus()ハンドラーは、後の手順8で作成するヘッドレスサービスによって呼び出されます。対話型コンポーネント(UIアプリ)とヘッドレスサービスは別々のプロセスで実行されるため、メモリ内の状態は共有されません。したがって、メモリ内の変数に依存する処理では不十分です。2つのコンポーネント間で信頼性の高いやり取りを実現するには、共有のメカニズムを使用して、ログインステータスを永続化して転送します。この永続ストレージからログインステータスを非同期に読み取ります。ヘッドレスサービスでは現在、ReactのAsyncStorageとVegaファイルシステムがサポートされています。MMKV(英語のみ)はサポートされません。以下の例ではAsyncStorageを使用しています。
以下は、AsyncStorageを利用するコンポーネントの実装例を示しています。
handleReadStatus()ハンドラーを登録して、システムから呼び出されたときにログインステータスを返します。getLoginStatus()では、前述のように永続ストレージからステータスを読み取る必要があります。getLoginStatus()はアプリに固有です。
手順5:アカウントログインサーバーを初期化し、コンポーネントハンドラーにリンクする
次に、AccountLoginWrapperクラスにsetupAccountLoginServer()メソッドを導入します。このメソッドは、IComponentInstanceオブジェクトをパラメーターとして受け入れます。以下のように実装します。
-
IAccountLoginServerAsyncのシングルトンインスタンスを作成し、メンバー変数のaccountLoginServerに格納します。 -
次に
setHandlerForComponent()を呼び出して、手順4で作成したhandleReadStatus()ハンドラーと、提供されたComponentInstanceを渡します。
手順6:アカウントログインステータスを更新する
アカウントログインステータスを更新するには、updateStatus()メソッドを非同期的に使用します。この関数を呼び出す前に、必ずログインステータスを永続ストレージに保存してください。
手順7:アカウントログインサーバーをサービスのライフサイクルと統合する
この統合を行うために、AccountLoginWrapperクラスでonStart()とonStop()の2つのメソッドを公開します。
onStart()
onStart()メソッドは、提供されたIComponentInstanceと共にsetupAccountLoginServer()を呼び出して、アカウントログインサーバーを初期化します。
onStop()
onStop()メソッドは、サービスを停止するときに実行する必要のあるクリーンアップロジックを追加します。
これらのメソッドを実装したら、AccountLoginWrapperInstanceというシングルトンインスタンスを作成し、それを使用して、同等のトップレベルメソッドとなるonStartService()とonStopService()の2つを公開します。これらのメソッドは、サービスコンポーネントと対話型コンポーネントの両方で、アカウントログインサーバーを起動および停止するために使用します。
手順8:ヘッドレスサービスを実装する
ヘッドレスサービスは、独自のReact Nativeランタイムを使用して、ユーザーインターフェイスなしで動作するバックグラウンドプロセスです。このサービスはログインステータスリクエストに応答するために重要なものであり、以下の手順で作成できます。- アプリのルートディレクトリにservice.jsという名前の新しいファイルを作成します。
-
前の手順で作成した
AccountLoginWrapperをインポートし、headless-task-managerもインポートします。 -
開始エントリポイントと終了エントリポイントを定義します。
com.amazondeveloper.media.sampleをアプリの実際のパッケージIDに置き換えてください。- エントリポイントの命名規則は、<アプリのパッケージID>.interface.provider::onStartServiceまたは::onStopServiceです。
onStartService()を呼び出して、アカウントログインサーバーをヘッドレスサービスとして初期化します。このプロセスの間に、handleReadStatus()関数が特定のサービスコンポーネントのインスタンスに登録されます。
このハンドラーが後でシステムから呼び出されると、handleReadStatus()は、アプリから報告された現在のログイン状態(サインイン済みまたはサインアウト)を返します。
手順9:ログイン状態を報告できるようにアカウントログインサーバーを初期化する
対話型コンポーネント(UIアプリ)でも、updateStatus()メソッドを使用してユーザーのログイン状態を報告するために、アカウントログインサーバーを初期化する必要があります。
手順10:ログインステータスの更新を送信する
対話型コンポーネント(UIアプリ)は、次のシナリオの発生時に、現在のログインステータスを指定してupdateStatus()メソッドを呼び出す必要があります。
- ユーザーがアプリを起動したとき。
- ユーザーのログインステータスが変更されたとき。
updateStatus()を呼び出す前にステータスを永続ストレージに保存して、handleReadStatus()で正しい値が取得され、返されるようにします。これにより、ユーザーの認証状態がシステムに常に反映され、シームレスなユーザーエクスペリエンスが実現されます。
このセットアップにより、メインアプリがアクティブに実行されていない場合でも、アプリでログインステータスリクエストを管理できます。
これでIAccountLoginServerComponentAsyncの単一のインスタンスが作成されました。システムでは、handleReadStatus()メソッドとIComponentInstanceの間にリンクが作成され、すべての読み取りリクエストがサービスコンポーネントに送られます。これを通じてアカウントログインステータスのクエリが処理されます。ログインステータスを強制的に更新する場合や、ステータスが変更されたときは、updateStatus()メソッドを呼び出します。
Vegaメディアアカウントログインに関するトラブルシューティング
アカウントログインとの統合時に発生する可能性のある問題はいくつか考えられますが、ここでは、特によくある問題の一部について説明します。サービスコンポーネントが起動することを確認する
updateStatus()の呼び出しが処理されるかどうかを確認します。処理された場合、サービスコンポーネントはクラッシュせずに起動しています。
updateStatus()の呼び出しを確認するには、vega device launch-app com.your.app.id.interface.providerを実行する前にログをキャプチャし、サービスコンポーネントの起動シーケンスの動作を監視します。サービスコンポーネント名に対応するログを調べて、このフェーズでクラッシュが発生していないかどうかを確認します。該当するログは、registerHeadlessEntryPoint()(onStartService)エントリポイントに到達した後に出力されます。
エラーやクラッシュがログに示されている場合は、Vegaのクラッシュのデバッグに関するドキュメントが役立つ可能性があります。
ハンドラーが呼び出されることを確認する
サービスが正常に起動していることがわかったら、サービスでsetHandlerForComponent()が使用され、ハンドラーが正しく登録されていることを確認します。この呼び出しの前後にログを追加すると、そのパスが実行されることを確認できます。サービスコンポーネントIDに対応するhandle_set_response_handlerから同等のログを確認することもできます。
handleReadStatus()の前後にもログを追加して、想定どおりに機能していることを確認します。

