動画リワード広告

AdMob を使用して、AdMob メディエーションによって C++ アプリで動画リワード広告を表示できます。

このガイドでは、動画リワード広告をリクエストして表示する方法、動画リワード広告が利用可能なタイミングを判断する方法、ユーザーに特典を付与する方法について説明します。

前提事項

動画リワード広告の C++ API を操作する前に、動画リワード広告の配信元にするアプリに、メディエーション ネットワーク アダプタと SDK を含める必要があります。アプリに動画リワード広告メディエーションを追加する手順については、iOS または Android 用のパブリッシャー向け動画リワード広告ガイドをご覧ください。

また、C++ アプリで初めて AdMob と Firebase を設定する場合は、AdMob と Firebase との統合に関する詳細な手順を AdMob C++ スタートガイドでご参照ください。

rewarded_video 名前空間を操作する

rewarded_video 名前空間には、Google Mobile Ads SDK を使用して動画リワード広告を表示するためのメソッドが含まれます。独自のオブジェクトを持つバナー広告やインタースティシャル広告とは異なり、動画リワード広告は rewarded_video 名前空間内の静的メソッドを使用して制御されます。

rewarded_video 名前空間にアクセスするには、アプリの C++ コードに次の include 文を追加します。

#include "firebase/admob/rewarded_video.h"

rewarded_video 名前空間を操作する基本的な手順は次のとおりです。

  1. Initialize() を呼び出してライブラリとメディエーション アダプタを初期化します。

    firebase::admob::rewarded_video::Initialize();
    
  2. ライブラリとメディエーション アダプタが初期化され、LoadAd() を呼び出して動画リワード広告を読み込める状態になります。

    firebase::admob::AdRequest my_ad_request;
    // Set some or all of the member variables in the AdRequest struct.
    firebase::admob::rewarded_video::LoadAd("YOUR_REWARDED_AD_UNIT_ID", my_ad_request);
    

    広告リクエストのターゲット設定とカスタマイズの例については、AdMob 広告リクエストを作成するをご覧ください。

  3. 動画リワード広告が読み込まれたら、Show() を呼び出して動画をユーザーに表示します。

    // my_ad_parent is a reference to an iOS UIView or an Android Activity. This is
    // the parent UIView or Activity of the rewarded video.
    firebase::admob::rewarded_video::Show(my_ad_parent);
    
  4. 必要に応じてステップ 2 と 3 を繰り返します。

  5. Pause() を呼び出して、動画リワード広告に関連付けられているバックグラウンド処理を一時停止します。

    firebase::admob::rewarded_video::Pause();
    

    C++ エンジンが一時停止したとき、またはアプリケーションがフォーカスを失ったときに、このメソッドを呼び出します。

  6. Resume() を呼び出して、ユーザーが Google Play からアプリに戻ったときなどに、一時停止状態から再開します。

    firebase::admob::rewarded_video::Resume();
    
  7. アプリで動画リワード広告を表示し終わったら、Destroy() を呼び出して、動画リワード広告の名前空間によって使用されているリソースをクリーンアップし、その割り当てを解除します。

    firebase::admob::rewarded_video::Destroy();
    

上記の手順では、動画リワード広告を読み込んで表示する際に使用するアプリの基本的なメソッド呼び出しに焦点を当てています。ただし、メソッドを呼び出す前に、前のメソッド呼び出しの完了ステータスをモニタリングすることをおすすめします。次のセクションでは、Future を使用して、rewarded_video 名前空間内の前のメソッド呼び出しの完了ステータスを特定する手順について説明します。

Future を使用して、メソッド呼び出しの完了ステータスをモニタリングする

Future を使用すると、前回の rewarded_video 名前空間のメソッド呼び出しの完了ステータスを特定できます。たとえば、rewarded_video::Initialize() メソッドが呼び出されると、新しい Future が作成され、返されます。詳細については、firebase::Future をご覧ください。アプリは、Future のステータスをポーリングして、初期化が完了したタイミングを特定できます。Future が完了になったら、動画リワード広告を読み込むことができます。

rewarded_video 名前空間のほとんどのメソッドには、対応する「前回の結果」メソッドがあります。アプリは、このメソッドを使用して特定のアクションの最新の Future を取得できます。たとえば、Initialize() メソッドには、Initialize() の直近の呼び出しの Future を返す InitializeLastResult() というメソッドがあります。

if (firebase::admob::rewarded_video::InitializeLastResult().status() ==
    firebase::kFutureStatusComplete &&
    firebase::admob::rewarded_video::InitializeLastResult().error() ==
    firebase::admob::kAdMobErrorNone) {
  firebase::admob::rewarded_video::LoadAd("YOUR_REWARDED_AD_UNIT_ID",
      my_ad_request);
}

LoadAdLastResult() メソッドを使用すると、前回の LoadAd() メソッド呼び出しのステータスを表す Future を取得できます。そのステータスが完了の場合は、動画リワード広告を次の区切りとなる自然なタイミングでアプリに表示できます。

if (firebase::admob::rewarded_video::LoadAdLastResult().status() ==
    firebase::kFutureStatusComplete &&
    firebase::admob::rewarded_video::LoadAdLastResult().error() ==
    firebase::admob::kAdMobErrorNone) {
  // my_ad_parent is a reference to an iOS UIView or an Android Activity.
  // This is the parent UIView or Activity of the rewarded video.
  firebase::admob::rewarded_video::Show(my_ad_parent);
}

リスナーを使用して広告ライフサイクル イベントの通知を受け取る

AdMob rewarded_video 名前空間には、特典や動画リワード広告の表示状態の変化について通知を受けるために、拡張して SetListener() メソッドに渡すことができる Listener 抽象クラスが用意されています。

以下に、Listener 抽象クラスを拡張したクラスのサンプル実装を示します。

// A simple listener that logs changes to rewarded video state.
class LoggingRewardedVideoListener
    : public firebase::admob::rewarded_video::Listener {
 public:
  LoggingRewardedVideoListener() {}
  void OnRewarded(firebase::admob::rewarded_video::RewardItem reward) override {
    LogMessage("Rewarding user with %f %s.", reward.amount,
               reward.reward_type.c_str());
  }
  void OnPresentationStateChanged(
      firebase::admob::rewarded_video::PresentationState state) override {
    LogMessage("Rewarded video PresentationState has changed to %d.", state);
  }
};

// After calling Initialize and waiting for the Initialize future to complete
// successfully, set the listener.
LoggingRewardedVideoListener rewarded_video_listener;
firebase::admob::rewarded_video::SetListener(&rewarded_video_listener);

特典をポーリングする

rewarded_video 名前空間には、インスタンス化して SetListener() メソッドに渡すことができる PollableRewardListener クラスも用意されています。このクラスを代替手段として使用すると、Listener 抽象クラスを拡張することなく特典にアクセスできます。

ポーリング ベースのリスナーは、キューを使用して Mobile Ads SDK によって付与された特典を保持し、後で取得できるようにします。PollableRewardListenerPollReward(RewardItem* reward) メソッドは、キューに入れられた特典の中で最も古いものを取り出して、そのデータを指定された RewardItem 構造体にコピーします。

以下に、rewarded_video::PollableRewardListener クラスを使用して特典をポーリングする場合のサンプル実装を示します。

// After calling Initialize and waiting for the Initialize future to complete
// successfully, instantiate a PollableRewardListener object and set the listener.
firebase::admob::rewarded_video::PollableRewardListener* listener =
    new firebase::admob::rewarded_video::PollableRewardListener();

// Pass the PollableRewardListener object to the SetListener method.
firebase::admob::rewarded_video::SetListener(listener);

...
// Display the rewarded videos to users so they can earn rewards.
...

// Declare a RewardItem struct. Pass this RewardItem struct by reference to
// the PollReward method.
firebase::admob::rewarded_video::RewardItem reward;
// Call the PollReward method to see if a reward is available.
while (listener->PollReward(&reward)) {
  // A reward is available. Do something with the reward.
  printf("Reward user with %f %s.", reward.amount, reward.reward_type);
}

シンプルなゲームループの例

以下に、ステートマシンを使用して rewarded_video 名前空間のメソッド呼び出しを追跡するシンプルなゲームループを示します。

namespace rewarded_video = firebase::admob::rewarded_video;

enum State {
  kNextStepInitialize,
  kNextStepLoadAd,
  kNextStepShowAd,
  kNextStepRewardUser,
  kNextStepRestartGame
}

// Instantiate a PollableRewardListener object.
firebase::admob::rewarded_video::PollableRewardListener* listener =
    new firebase::admob::rewarded_video::PollableRewardListener();

State state = kNextStepInitialize;
for ( ; ; ) /* game loop */ {
  switch (state) {
    case kNextStepInitialize:
      rewarded_video::Initialize();
      state = kNextStepLoadAd;
      break;
    case kNextStepLoadAd:
      if (rewarded_video::InitializeLastResult().status() ==
          firebase::kFutureStatusComplete &&
          rewarded_video::InitializeLastResult().error() ==
          firebase::admob::kAdMobErrorNone) {
        // Pass the PollableRewardListener object to the SetListener method.
        firebase::admob::rewarded_video::SetListener(listener);
        rewarded_video::LoadAd("YOUR_REWARDED_AD_UNIT_ID",
                               my_ad_request);
      }
      state = kNextStepShowAd;
      break;
    case kNextStepShowAd:
      if (rewarded_video::LoadAdLastResult().status() ==
          firebase::kFutureStatusComplete &&
          rewarded_video::LoadAdLastResult().error() ==
          firebase::admob::kAdMobErrorNone) {
        rewarded_video::Show(my_ad_parent);
      }

      if (rewarded_video::ShowLastResult().status() ==
          firebase::kFutureStatusComplete &&
          rewarded_video::ShowLastResult().error() ==
          firebase::admob::kAdMobErrorNone &&
          rewarded_video::presentation_state() ==
          rewarded_video::kPresentationStateHidden) {
        // If the rewarded video has been displayed to the user and
        // the user closed the ad, then reward the user.
        state = kNextStepRewardUser;
      }
      break;
    case kNextStepRewardUser:
      firebase::admob::rewarded_video::RewardItem reward;
      // Call the PollReward method to see if a reward is available.
      while (listener->PollReward(&reward)) {
        // A reward is available. Do something with the reward.
        printf("Reward user with %f %s.", reward.amount, reward.reward_type);
      }
      state = kNextStepRestartGame;
      break;
    case kNextStepRestartGame:
      // restart game
      break;
  }

  // render game
}

次のステップ

動画リワード広告について詳しくは、iOS 向け動画リワード広告Android 向け動画リワード広告のスタートガイドをご覧ください。