Check out what’s new from Firebase at Google I/O 2022. Learn more

Video reward

Anda dapat menggunakan AdMob untuk menampilkan video reward di aplikasi C++ melalui mediasi AdMob.

Panduan ini menunjukkan cara meminta dan menampilkan video reward, menentukan kapan video reward tersedia, dan memberi reward kepada pengguna.

Prasyarat

Sebelum mulai berinteraksi dengan C++ API video reward, Anda harus menyertakan adaptor jaringan mediasi dan SDK di aplikasi yang ingin Anda gunakan untuk menayangkan video reward. Langkah-langkah untuk menambahkan mediasi video reward ke aplikasi dapat dilihat dalam panduan video reward penayang untuk iOS dan Android.

Selain itu, jika ini adalah pertama kalinya Anda menyiapkan AdMob dan Firebase di aplikasi C++, lihat panduan Memulai AdMob C++ untuk petunjuk langkah demi langkah dalam mengintegrasikan aplikasi dengan AdMob dan Firebase.

Berinteraksi dengan namespace rewarded_video

Namespace rewarded_video berisi metode untuk menampilkan video reward melalui Google Mobile Ads SDK. Tidak seperti iklan banner dan interstisial yang memiliki objeknya sendiri, video reward dikontrol menggunakan metode statis di namespace rewarded_video.

Untuk mengakses namespace rewarded_video, tambahkan penyertaan berikut ke kode C ++ aplikasi Anda:

#include "firebase/admob/rewarded_video.h"

Berikut adalah langkah dasar untuk berinteraksi dengan namespace rewarded_video:

  1. Panggil Initialize() untuk menginisialisasi library dan adaptor mediasi:

    firebase::admob::rewarded_video::Initialize();
    
  2. Setelah library dan adaptor mediasi diinisialisasi, Anda siap memanggil LoadAd() untuk memuat video reward:

    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);
    

    Lihat Membuat permintaan iklan AdMob untuk contoh penargetan dan penyesuaian permintaan iklan.

  3. Setelah video reward dimuat, panggil Show() untuk menampilkan video kepada pengguna:

    // 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. Ulangi langkah 2 dan 3 sesuai kebutuhan.

  5. Panggil Pause() untuk menjeda pemrosesan latar belakang yang terkait dengan video reward:

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

    Panggil metode ini setiap kali mesin C++ berhenti atau aplikasi kehilangan fokus.

  6. Panggil Resume() untuk melanjutkan jeda, misalnya, saat pengguna kembali ke aplikasi Anda dari Google Play:

    firebase::admob::rewarded_video::Resume();
    
  7. Setelah menampilkan iklan video reward di aplikasi, panggil Destroy() untuk membersihkan dan mengembalikan alokasi resource yang digunakan oleh namespace video reward:

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

Langkah-langkah di atas menunjukkan panggilan metode dasar yang dapat digunakan aplikasi Anda ketika memuat dan menampilkan video reward. Namun, praktik terbaiknya adalah memantau status penyelesaian panggilan metode yang sebelumnya sebelum memanggilnya. Bagian berikutnya menjelaskan langkah-langkah menggunakan Future untuk menentukan status penyelesaian panggilan metode namespace rewarded_video sebelumnya.

Menggunakan Future untuk mengawasi status penyelesaian panggilan metode

Future menyediakan cara untuk menentukan status penyelesaian panggilan metode namespace rewarded_video Anda sebelumnya. Misalnya, saat panggilan dilakukan ke metode rewarded_video::Initialize(), Future baru akan dibuat dan ditampilkan. Lihat firebase::Future untuk detail lebih lanjut. Aplikasi dapat memeriksa status Future untuk menentukan kapan inisialisasi selesai. Setelah Future selesai, Anda siap untuk memuat video reward.

Sebagian besar metode dalam namespace rewarded_video memiliki metode "hasil terakhir" yang sesuai, yang dapat digunakan aplikasi untuk mengambil Future terbaru untuk tindakan tertentu. Metode Initialize(), misalnya, memiliki metode yang disebut InitializeLastResult() yang menampilkan Future untuk panggilan terbaru ke Initialize():

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);
}

Gunakan metode LoadAdLastResult() untuk mendapatkan Future yang mewakili status panggilan terakhir ke metode LoadAd(). Jika statusnya selesai, maka Anda dapat menampilkan video reward di titik pemberhentian alami selanjutnya dalam aplikasi Anda:

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);
}

Menggunakan pemroses untuk mendapatkan notifikasi mengenai peristiwa siklus proses iklan

Namespace rewarded_video AdMob menyediakan class Listener abstrak yang dapat Anda perluas dan teruskan ke metode SetListener() untuk mendapatkan notifikasi tentang reward dan perubahan status presentasi video reward.

Berikut adalah contoh implementasi class yang memperluas class Listener abstrak:

// 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);

Memeriksa reward

Namespace rewarded_video juga menyediakan PollableRewardListener, class yang instance-nya dapat dibuat dan diteruskan ke metode SetListener(). Class ini menyediakan opsi alternatif untuk mengakses reward tanpa harus memperluas class Listener abstrak.

Pemroses berbasis pemeriksaan menggunakan antrean untuk mengelola award yang diberikan oleh Mobile Ads SDK, yang dapat diambil di lain waktu. Metode PollReward(RewardItem* reward) dari PollableRewardListener memunculkan reward antrean terlama dan menyalin datanya ke dalam struct RewardItem yang diberikan.

Berikut ini contoh implementasi untuk memeriksa reward menggunakan class 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);
}

Contoh game loop sederhana

Berikut adalah game loop sederhana yang menggunakan mesin status untuk memantau panggilan metode ke namespace 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
}

Langkah selanjutnya

Lihat Panduan Memulai Video Reward di iOS dan Video Reward di Android untuk mengetahui informasi lebih lanjut tentang iklan Video Reward.