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