ユーザーがアプリ内アイテムや特典のロックを解除できるようにする方法として、特典アイテムの作成や、ユーザーが動画広告を見た後に受け取るアイテムを作成する方法があげられます。特典アイテムを提供することで、ユーザーは直接購入していなくてもアプリ内で特典を受けることができます。
このドキュメントでは、特典アイテムに固有の機能を実装する方法について説明しています。このページのワークフロー図のセクションで、このプロセスについて説明します。
アプリの特典アイテムの指定
特典アイテムの SkuType は INAPP です。ユーザーが複数の広告を視聴して複数のリワードを獲得できるようにするには、プロダクトが消費される必要があります。
ユーザーに特典アイテムを提供するには、アイテムの SkuDetails を取得する必要があります。これを行うには、商品タイプとして SkuType.INAPP を指定して querySkuDetailsAsync() を呼び出します。
年齢に適した広告を宣言する
児童オンライン プライバシー保護法(COPPA)や 一般データ保護規則(GDPR)など、子どもや未成年ユーザーに関する法的義務の遵守を促進するため、アプリでは、米国で子ども向けとして扱われるべき広告と、各国の適用される同意年齢未満のユーザーを対象とする広告を宣言する必要があります。広告リクエストに子供向け取り扱いのタグを設定する必要があるケース、同意年齢に満たないユーザー向け取り扱いのタグを設定する必要があるケース、それによる影響については、AdMob のヘルプセンターでご確認ください。
アプリの請求クライアントを作成する際には、リワード広告リクエストを子供向けとするか、それとも同意年齢に満たないユーザー向けとするかを検討してください。広告リクエストにこれらの制限を適用する必要がある場合は、setChildDirected() メソッドと setUnderAgeOfConsent() メソッドを呼び出し、各メソッドに適切な値を渡します。
次のコード スニペットは、動画広告が子供または同意年齢に満たないユーザー向けであることを宣言する方法を示しています。
Kotlin
val billingClient = BillingClient.newBuilder(context) .setListener(this) .setChildDirected(ChildDirected.CHILD_DIRECTED) .setUnderAgeOfConsent(UnderAgeOfConsent.UNDER_AGE_OF_CONSENT) .build()
Java
BillingClient billingClient = BillingClient.newBuilder(context) .setListener(this) .setChildDirected(ChildDirected.CHILD_DIRECTED) .setUnderAgeOfConsent(UnderAgeOfConsent.UNDER_AGE_OF_CONSENT) .build();
動画広告の読み込み
特典アイテムを受け取るために動画広告を見るオプションをユーザーに表示する前に、動画を読み込む必要があります。そのためには、RewardLoadParams オブジェクトを作成し、特典アイテムを表す SkuDetails オブジェクトに関連付けます。次に、請求クライアントの loadRewardedSku() メソッドを呼び出し、RewardLoadParams オブジェクトと RewardResponseListener オブジェクトを渡します。
動画の読み込みが終わると、RewardResponseListener リスナーに通知されます。動画が利用できない場合や、サーバーのタイムアウトなどのエラーが発生した場合も、リスナーに通知されます。
アプリの特典アイテムに関連付けられた動画を読み込む際のデバイスのパフォーマンスを維持するには、以下を念頭に置いてください。
- 同時に読み込む特典アイテムの SKU は 3 つまでにします。
- ユーザーがアプリに入るたびに、動画の読み込みを試みます。これにより、動画がまだ読み込み済みで利用可能な状態かどうかを確認できます。
動画をいつ読み込むかを決める際は、使用帯域幅とアプリのレスポンスとのバランスをユースケースにとって適したものにします。
- 最も早いタイミングとして、対象とする特典アイテムの
getSkuDetails()を呼び出したらすぐに動画を読み込みます。アプリはレスポンシブな状態のままですが、ユーザーが視聴しない動画を読み込むためにネットワークを浪費する可能性があります。 - 動画が表示されるページにユーザーが移動したら、できるだけ遅く動画を読み込んでください。この場合、アプリが帯域幅を浪費することはめったにありませんが、動画を視聴するためのボタンがクリックできるようになるまで多ユーザーは多少待たなければなりません。
- 最も早いタイミングとして、対象とする特典アイテムの
次のコード スニペットは、ユーザーが特典アイテムを受け取る前に再生する動画広告を読み込むプロセスを示しています。
Kotlin
if (skuDetails.isRewarded()) { val params = RewardLoadParams.Builder() .setSkuDetails(skuDetails) .build() mBillingClient.loadRewardedSku(params.build(), object : RewardResponseListener { override fun onRewardResponse(@BillingResponse responseCode : Int) { if (responseCode == BillingResponse.OK) { // Enable the reward product, or make // any necessary updates to the UI. } } }) }
Java
if (skuDetails.isRewarded()) { RewardLoadParams.Builder params = RewardLoadParams.newBuilder(); params.setSkuDetails(skuDetails); mBillingClient.loadRewardedSku(params.build(), new RewardResponseListener() { @Override public void onRewardResponse(int responseCode) { if (responseCode == BillingResponse.OK) { // Enable the reward product, or make // any necessary updates to the UI. } } }); }
ユーザーへの特典アイテムの供与
Google Play Billing Library が、特典アイテムに関連付けられた動画を正常に読み込んだ場合(つまり、RewardResponseListener が BillingResponse.OK の responseCode を受け取った場合)、請求フローを開始できます。
リワード アイテムの広告の再生は、他のすべてのアプリ内アイテムと同様に、launchBillingFlow() を呼び出すことで開始します。ユーザーは特典アイテムを受け取るために直接購入を行うわけではありませんが、ユーザーがアイテムを入手して使用できるように、請求フローを有効にする必要があります。
購入の消費
ユーザーがリワード アイテムを受け取って使用したことを課金クライアントに通知するには、課金クライアント リスナーの onPurchasesUpdated() メソッドで購入を処理します。リワード購入は消費される必要があります。
特典アイテムのテスト
アプリがどのように動画広告を読み込み、ユーザーに特典アイテムを提供するかをテストするには、デフォルトで本物の代わりにテスト中の広告を取得するライセンスを保持するテスターに依頼できます。テスター用のアカウントをセットアップする方法については、Google Play 請求サービスを実装するアプリのユーザーテストを行うをご覧ください。
もうひとつのテスト方法として、android.test.reward というアイテム ID を使用する方法があります。この特定のアイテムは Google Play 請求サービスで予約済みの名前であるため、Google Play Console のアプリ内アイテムのリストに追加する必要はありません。
注意: アプリの特典アイテムをテストする際は、実際のサービスを使用しないでください。使用すると、アカウントがスパムまたは不正なアカウントとしてフラグされる可能性があります。
ただし、テストが完了したら、エンドユーザーに製品版アプリを展開する前に、android.test.reward を実際の特典アイテムのアイテム ID に置き換えてください。
特典アイテムのワークフロー図
次のシーケンス図は、ユーザー、アプリ、Google Play Billing Library が連携して動画広告を表示し、ユーザーに特典アイテムへのアクセスを許可する方法を示しています。