アプリ内課金(IAP)のベストプラクティス - アプリの起動時間を短縮する
アプリの起動時にアプリ内課金(IAP)APIを呼び出すと、アプリの起動時間が大幅に長くなり、ユーザーエクスペリエンスが低下する可能性があります。Amazonアプリストアでは、アプリを読み込む際の遅延を回避するため、このようなサーバー側の呼び出しをバックグラウンドで行うことをベストプラクティスとして推奨しています。
UIの読み込みをブロックしないようにする
IAP APIをアプリに組み込む方法では、onResume()
メソッドでgetUserData()
とgetPurchaseUpdates()
を呼び出し、ユーザーのエンタイトルメントのステータスをクエリするよう指示されています。これらのAPIでは、Amazonのバックエンドサーバーに対するサーバー側の呼び出しが必要です。最初の呼び出しはキャッシュされず、実行に最大2秒かかることがあるため、アプリの起動時間が長くなる可能性があります。それ以降の呼び出しはキャッシュされるため、このような遅延は発生しません。
起動時の遅延を防ぐため、アプリがAmazonのサーバーからの応答を待つ間、UIの読み込みがブロックされないようにします。Amazonアプリストアでは、バックエンドサーバーにキャッシュした最後のエンタイトルメントのステータスを代わりに使用することをお勧めします。これは、ユーザーが最後にログインしたときやアプリにアクセスしたとき、またはリアルタイム通知が最後に更新されたときのもので構いません。
getUserData()
およびgetPurchaseUpdates()
からの応答を受信したら、Amazonのレシート検証サービス(RVS)に問い合わせて、ユーザーの現在のエンタイトルメントのステータスを入手します。これにより、同期の問題を回避できます。受信したデータをバックエンドサーバーにキャッシュします。その後、アプリのUIを非同期で更新し、エンタイトルメントのステータスの変更を反映します。
アーキテクチャ図
これらの図を使用すると、アプリの読み込み中にIAPを呼び出した場合の動作を視覚化できます。
典型的なフロー: IAPの呼び出しによってUIの読み込みがブロックされている
この図は、IAPの呼び出しによってUIの読み込みがブロックされている場合の、アプリの起動からアプリのUI読み込みまでのステップを示しています。
典型的なフローの説明
- ユーザーがアプリをタップして起動します。
- アプリのUIの読み込み中、黒い画面が表示されます。
- アプリが起動を開始します。
onResume()
では、アプリがUIスレッド上にgetUserData()
、そしてその後getPurchaseUpdates()
を呼び出します。読み込みに約2秒の遅延が発生します。この間、黒い画面の表示が続きます。 - アプリがRVSを呼び出し、返されたレシートでエンタイトルメントのステータスを確認します。
- エンタイトルメントのステータスがアクティブな場合に、アプリはユーザーにアクセス権を付与します。
- アプリはスプラッシュスクリーンを表示し、UIの読み込みを続行します。
この典型的なフローでは、IAPの呼び出し中に黒い画面が数秒間表示されるため、アプリの起動が遅く感じられます。
推奨するフロー: IAPの呼び出しがバックグラウンドで実行されている
この図は、IAPの呼び出しがバックグラウンドで実行されている場合の、アプリの起動からアプリのUI読み込みまでのステップを示しています。
推奨するフローの説明
- 過去に使用したエンタイトルメントのデータを最低30日間キャッシュするか、バックエンドに保存します。
- ユーザーがアプリをタップして起動します。
- アプリはスプラッシュスクリーンを表示し、キャッシュデータに基づいてUIを読み込みます。アプリは、サーバーから受信したエンタイトルメントのデータについてはチェックしません。
- アプリは、バックグラウンドで
getUserData()
およびgetPurchaseUpdates()
の呼び出しを実行します。UIの読み込みはブロックされません。 getUserData()
およびgetPurchaseUpdates()
の呼び出しの結果が返されたら、レシートをバックエンドサーバーに渡します。バックエンドサーバーはレシート検証サービス(RVS)を呼び出し、レシートが有効であることを確認します。- レシートが有効であれば、キャッシュ(またはバックエンド)を新しいデータと同期します。
- 必要に応じてUIを更新するか切り替えることで、コンテンツに対するユーザーのアクセスをブロックまたはブロック解除できます。
Last updated: 2024年2月23日