ユーザーがアプリ内アイテムや特典のロックを解除できるようにする方法として、特典アイテムの作成や、ユーザーが動画広告を見た後に受け取るアイテムを作成する方法があげられます。特典アイテムを提供することで、ユーザーは直接購入していなくてもアプリ内で特典を受けることができます。
このドキュメントでは、特典アイテムに固有の機能を実装する方法について説明しています。このページのワークフロー図でそのプロセスを表示しています。
アプリの特典アイテムの指定
特典アイテムの SkuType
は INAPP
です。
ユーザーが複数の広告を視聴していくつもの特典を獲得できるようにするには、アイテムが消費される必要があります。
ユーザーに特典アイテムを提供するには、その前にアイテムの SkuDetails
を取得する必要があります。これを行うには、アイテムタイプを SkuType.INAPP
にして querySkuDetailsAsync()
を呼び出します。
年齢に応じた広告の宣言
児童オンライン プライバシー保護法(Children's Online Privacy Protection Act、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 請求サービス ライブラリによって、特典アイテムに関連付けられた動画が正常に読み込まれたら(つまり、RewardResponseListener
が受信した responseCode
が BillingResponse.OK
の場合)、請求フローを開始できます。
他のタイプのアプリ内アイテムと同様に、launchBillingFlow()
を呼び出すことで特典アイテム用の広告の再生を開始します。ユーザーが特典アイテムを受け取るために直接購入していなくても、アイテムを入手して使用できるように請求フローを有効にする必要があります。
購入の消費
ユーザーが特典アイテムを受け取って消費したことを請求クライアントに知らせるには、請求クライアントのリスナーの onPurchasesUpdated()
メソッドで購入を処理します。特典アイテムは消費される必要があることに注意してください。
特典アイテムのテスト
アプリがどのように動画広告を読み込み、ユーザーに特典アイテムを提供するかをテストするには、デフォルトで本物の代わりにテスト中の広告を取得するライセンスを保持するテスターに依頼できます。テスター用のアカウントをセットアップする方法については、Google Play 請求サービスを実装するアプリのユーザーテストを行うをご覧ください。
もうひとつのテスト方法として、android.test.reward
というアイテム ID を使用する方法があります。この特殊なアイテム ID は Google Play 請求サービスで予約済みのため、Play Console でアプリ内アイテムのリストに追加する必要はありません。
注意: アプリの特典アイテムをテストする際は、実際のサービスを使用しないでください。使用すると、アカウントがスパムまたは不正なアカウントとしてフラグされる可能性があります。
ただし、テストが完了したら、エンドユーザーに製品版アプリを展開する前に、android.test.reward
を実際の特典アイテムのアイテム ID に置き換えてください。
特典アイテムのワークフロー図
次のシーケンス図は、ユーザー、アプリ、Google Play Billing Library が連携して動画広告を表示し、ユーザーに特典アイテムへのアクセスを許可する方法を示しています。