Quantcast
Channel: Google Developers Japan
Viewing all articles
Browse latest Browse all 2207

高度なアプリ内課金: 様々な購入フローに対応する

$
0
0
この記事は デベロッパー アドボケート、Oscar Rodriguez による Android Developers Blog の記事 "Advanced in-app billing: handling alternative purchase flows" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。


アプリやゲームを設計して開発するにつれ、収益化をどうするかが考え始めるときがあるでしょう。
Google Play でプロダクトを販売して収益化すると決めたら、販売するアイテムを表示するストア画面を作り、Google Play Billing Libraryを使ってユーザーが購入するダイアログを表示することになるでしょう。
ドキュメントや Billing Library TrivialDrive サンプルには詳しい説明が掲載されていますが、一般的なフローは次のようになります。
  1. UI スレッドから launchBillingFlow()メソッドを呼び出し、Google Play 購入ダイアログを表示します。
  2. 購入が成功すると、Google Play によって onPurchasesUpdated()メソッドが呼ばれ、購入オペレーションの結果が渡されます。
  3. アプリにサーバーがある場合、サーバーから購入を検証することを強くお勧めします。これには、Subscriptions and In-App Purchases APIを使います。
  4. 消費可能アイテムは consumeAsync()で、消費不可アイテムは acknowledgePurchase()で購入を承諾します。
  5. 最後に、アプリ内で購入したアイテムを付与します。
まだ Google Play Billing AIDL APIを使い続けているアプリでも、同じタスクを実行できます。なお、AIDL API は非推奨となっているので、できるだけ早く Google Play Billing Libraryに移行することを強くお勧めします。
AIDL API でも、フローはほぼ同じです
  1. getBuyIntent()リクエストまたは getBuyIntentExtraParams()リクエストを送って購入するアイテムを指定し、続いて startIntentSenderForResult()を呼び出して Google Play 購入ダイアログを表示します。
  2. 購入ダイアログが閉じられると、Google Play によって onActivityResult()メソッドに応答の Intentが送られます。ここで、購入が成功したかどうかを確認できます。
  3. アプリにサーバーがある場合、サーバーから購入を検証することを強くお勧めします。これには、Subscriptions and In-App Purchases APIを使います。
  4. 購入が成功した場合、getPurchases()メソッドを呼び出して、まだ消費されていない所有アイテムの一覧を取得します。消費可能アイテムの場合は、consumePurchase()メソッドを呼び出して再購入できるようにします。
  5. 最後に、アプリ内で購入したアイテムを付与します。
ただし、以上のフローを実装しただけでは、すべてのタイプの購入を正しく処理することはできません。このフローで正しく購入を処理できないのは、主に 2 つの場合です。
1 つ目は、購入フローが完了する前に中断された場合です。たとえば、アプリがクラッシュした、ユーザーがアプリを強制終了させた、インターネット接続が失われた、などが考えられます。いずれにしても、Google Play で支払いの処理が終わっているにもかかわらず、ユーザーにアイテムが提供されていない状況に陥る可能性があります。この場合、アイテムは中途半端な状態です。Google Play はアイテムを消費するまで再購入が認められませんが、アプリやゲームでは前述のフロー以外でアイテムが消費されることはないからです。
2 つ目は、別の購入フローによって発生します。別の購入フローとは、アプリ内プロモーション、最近発表されたアプリ外サブスクリプション サーフェスサブスクリプション用プロモーション コード、Google と連携したその他のプロモーションなどを指します。この場合、ユーザーは Play ストアアプリで直接アイテムを入手しますが、その間、対象のアプリやゲームは一時停止されているか実行されていない状態にあります。または、対象のアプリがインストールされていない可能性もあります。
このような場合に備えて、Google Play Billing Library と Google Play Billing AIDL API には、承諾または消費されていない購入を検知できる仕組みが組み込まれています。
Google Play Billing API を使っている場合、次のようにします。
  1. アプリの onResume()コールバックで queryPurchases()メソッドを呼び出し、アイテムのリストを取得します。これを使って承諾していないアイテムを検知することができます。
  2. アプリにサーバーがある場合、サーバーから購入を検証することを強くお勧めします。これには、Subscriptions and In-App Purchases APIを使います。
  3. 承諾されていない所有アイテムがある場合は、消費可能アイテムには consumeAsync()を、消費不可アイテムには acknowledgePurchase()を使って購入を承諾します。
  4. 購入したアイテムをアプリ内で付与します。
Google Play Billing AIDL API では、次のようにします。
  1. アプリの onResume()コールバックで getPurchases()メソッドを呼び出し、まだ消費されていない所有アイテムの一覧を取得します。
  2. アプリにサーバーがある場合、サーバーから購入を検証することを強くお勧めします。これには、Subscriptions and In-App Purchases APIを使います。
  3. 消費可能アイテムの場合は、consumePurchase()メソッドを呼び出して再購入できるようにします。
  4. 最後に、アプリ内で購入したアイテムを付与します。
どちらの場合でも、この方法で消費されていないアイテムを検知して処理する場合は、ユーザーはアプリやゲームがそのアイテムについて通知してくれることを期待します。ダイアログやメッセージ ボックス、通知を表示し、アイテムが入手できたことをユーザーにお知らせすることをお勧めします。
アプリの onResume()コールバックは、プロセスが開始した場合に加え、フォアグラウンドになった場合にも呼ばれる点に注意してください。アプリやゲームが一時停止する前にどのような画面が表示されていたかにはよりません。たとえば、ホーム画面、ストア画面、ゲーム画面があるゲームでは、すべての画面から onResume()が呼ばれる可能性があります。最適なユーザー エクスペリエンスを実現するために、onResume()が呼ばれた際に表示されている画面に関係なく、承諾または消費していないアイテムを処理できるようにすることをお勧めします。優れたユーザー エクスペリエンスを提供するには、それぞれの画面でこの処理を徹底的にテストすることが欠かせません。
最後に、アプリで処理しなければならないもう 1 つのケースが存在します。それは、Play ストアアプリでアイテムを入手した際に、マルチウィンドウ モードで Play ストアアプリと対象のアプリの両方が見えている場合です。
Google Play Billing Library でこれをサポートするには、次のようにします。
  1. 保留になっている新しいアイテムがあることをアプリに通知するため、Google Play によって onPurchasesUpdated()メソッドが呼ばれます。
  2. アプリにサーバーがある場合、サーバーから購入を検証することを強くお勧めします。これには、Subscriptions and In-App Purchases APIを使います。
  3. 消費可能アイテムは consumeAsync()で、消費不可アイテムは acknowledgePurchase()で購入を承諾します。
  4. 最後に、アプリ内で購入したアイテムを付与します。
Google Play Billing AIDL API では、次のようにします。
  1. アプリの onResume()コールバックで PurchasesUpdatedListenerを登録し、com.android.vending.billing.PURCHASES_UPDATEDインテントを受け取れるようにします。また、アプリの onPause()コールバックでリスナーの登録を解除します。
  2. アプリにサーバーがある場合、サーバーから購入を検証することを強くお勧めします。これには、Subscriptions and In-App Purchases APIを使います。
  3. 保留になっている新しいアイテムがあることをアプリに通知するため、Google Play によってリスナーが呼ばれます。リスナーで getPurchases()メソッドを呼び出し、まだ消費されていない所有アイテムの一覧を取得します。消費可能アイテムの場合は、consumePurchase()メソッドを呼び出して再購入できるようにします。
  4. 最後に、アプリ内で購入したアイテムを付与します。
先ほどと同じように、ダイアログやメッセージ ボックス、通知を表示し、アイテムが入手できたことをユーザーにお知らせしましょう。
以上の手順に従えば、アプリやゲームは購入フローの中断や別の購入フローに確実に対処できるようになります。

Reviewed by Yuichi Araki - Developer Relations Team


Viewing all articles
Browse latest Browse all 2207

Trending Articles