Объявления с вознаграждением


Реклама с вознаграждением позволяет пользователям взаимодействовать с ней в обмен на внутриигровые награды. В этом руководстве показано, как интегрировать рекламу с вознаграждением в приложения для Android и iOS с помощью Google Mobile Ads C++ SDK.

Ознакомьтесь с историями успеха наших клиентов: пример 1 , пример 2 .

Предварительные требования

Всегда проводите тестирование с помощью тестовых объявлений.

При разработке и тестировании приложений обязательно используйте тестовые объявления, а не реальные, рабочие объявления. Несоблюдение этого правила может привести к блокировке вашего аккаунта.

Самый простой способ загрузить тестовые объявления — использовать наш специальный идентификатор тестового рекламного блока для объявлений с вознаграждением, который различается в зависимости от платформы устройства:

  • Android: ca-app-pub-3940256099942544/5224354917
  • iOS: ca-app-pub-3940256099942544/1712485313

Они специально настроены на возврат тестовых объявлений для каждого запроса, и вы можете свободно использовать их в своих приложениях во время кодирования, тестирования и отладки. Просто убедитесь, что вы заменили его на свой собственный идентификатор рекламного блока перед публикацией приложения.

Для получения дополнительной информации о том, как работают тестовые объявления в Mobile Ads SDK, см. раздел «Тестовые объявления» .

Выполнение

Основные шаги по интеграции рекламы с вознаграждением:

  1. Загрузить рекламу.
  2. Зарегистрируйтесь для участия в обратном звонке.
  3. Показать рекламу и обработать событие с вознаграждением.

Настройте RewardedAd

Рекламные объявления с вознаграждением отображаются в объектах RewardedAd , поэтому первым шагом к интеграции таких объявлений в ваше приложение является создание и инициализация экземпляра RewardedAd .

  1. Добавьте следующий заголовочный файл в код вашего приложения на C++:

     #include "firebase/gma/rewarded_ad.h"

  2. Объявите и создайте экземпляр объекта RewardedAd :

     firebase::gma::RewardedAd* rewarded_ad;
     rewarded_ad = new firebase::gma::RewardedAd();

  3. Инициализируйте экземпляр RewardedAd , используя родительский элемент представления, преобразованный в тип AdParent . Родительский элемент представления представляет собой ссылку на jobject JNI Activity в Android или указатель на UIView в iOS.

    // my_ad_parent is a jobject reference to an Android Activity or
    // a pointer to an iOS UIView.
    firebase::gma::AdParent ad_parent =
      static_cast<firebase::gma::AdParent>(my_ad_parent);
    firebase::Future<void> result = rewarded_ad->Initialize(ad_parent);
    
  4. В качестве альтернативы сохранению будущего значения в качестве переменной, вы можете периодически проверять статус операции инициализации, вызывая InitializeLastResult() для объекта RewardedAd . Это может быть полезно для отслеживания процесса инициализации в глобальном игровом цикле.

    // Monitor the status of the future in your game loop:
    firebase::Future<void> result = rewarded_ad->InitializeLastResult();
    if (result.status() == firebase::kFutureStatusComplete) {
      // Initialization completed.
      if(future.error() == firebase::gma::kAdErrorCodeNone) {
        // Initialization successful.
      } else {
        // An error has occurred.
      }
    } else {
      // Initialization on-going.
    }
    

Для получения дополнительной информации о работе с firebase::Future см. раздел «Использование Future для отслеживания статуса завершения вызовов методов» .

Загрузить рекламу

Загрузка рекламы осуществляется с помощью метода LoadAd() объекта RewardedAd . Для работы метода LoadAd необходимо инициализировать объект RewardedAd , а также иметь идентификатор рекламного блока и объект AdRequest . Возвращается firebase::Future , который можно использовать для отслеживания состояния и результата операции загрузки.

Следующий код показывает, как загрузить объявление после успешной инициализации RewardedAd :

firebase::gma::AdRequest ad_request;
firebase::Future<firebase::gma::AdResult> load_ad_result;
load_ad_result = rewarded_ad->LoadAd(rewarded_ad_unit_id, ad_request);

Зарегистрируйтесь для участия в обратном звонке.

Для получения уведомлений о показе рекламы с вознаграждением и событиях жизненного цикла необходимо расширить класс FullScreenContentListener . Ваш пользовательский подкласс FullScreenContentListener можно зарегистрировать с помощью метода RewardedAd::SetFullScreenContentListener() , и он будет получать обратные вызовы при успешном или неудачном показе рекламы, а также при её закрытии.

Следующий код показывает, как расширить класс и присвоить его объявлению:

  class ExampleFullScreenContentListener
      : public firebase::gma::FullScreenContentListener {

   public:
    ExampleFullScreenContentListener() {}

    void OnAdClicked() override {
      // This method is invoked when the user clicks the ad.
    }

    void OnAdDismissedFullScreenContent() override {
     // This method is invoked when the ad dismisses full screen content.
    }

    void OnAdFailedToShowFullScreenContent(const AdError& error) override {
      // This method is invoked when the ad failed to show full screen content.
      // Details about the error are contained within the AdError parameter.
    }

    void OnAdImpression() override {
      // This method is invoked when an impression is recorded for an ad.
    }

    void OnAdShowedFullScreenContent() override {
      // This method is invoked when the ad showed its full screen content.
    }
  };

  ExampleFullScreenContentListener* example_full_screen_content_listener =
    new ExampleFullScreenContentListener();
  rewarded_ad->SetFullScreenContentListener(example_full_screen_content_listener);

Объект RewardedAd является одноразовым. Это означает, что после показа рекламы с вознаграждением её нельзя показать снова. Рекомендуется загружать следующую рекламу с вознаграждением в методе OnAdDismissedFullScreenContent() вашего FullScreenContentListener , чтобы следующая реклама с вознаграждением начала загружаться сразу после закрытия предыдущей.

Покажите рекламу и организуйте событие с вознаграждением.

Перед показом рекламы с вознаграждением пользователям необходимо предоставить им явный выбор: просматривать рекламный контент в обмен на вознаграждение. Показ рекламы с вознаграждением всегда должен быть добровольным.

При показе рекламы необходимо предоставить объект UserEarnedReward для обработки вознаграждения пользователя.

Следующий код показывает, как отобразить RewardedAd :

// A simple listener track UserEarnedReward events.
class ExampleUserEarnedRewardListener :
    public firebase::gma::UserEarnedRewardListener {
 public:
   ExampleUserEarnedRewardListener() { }

  void OnUserEarnedReward(const firebase::gma::AdReward& reward) override {
    // Reward the user!
  }
};

ExampleUserEarnedRewardListener* user_earned_reward_listener =
  new ExampleUserEarnedRewardListener();
firebase::Future<void> result = rewarded_ad->Show(user_earned_reward_listener);

Часто задаваемые вопросы

Предусмотрен ли тайм-аут для вызова инициализации?
Через 10 секунд SDK Google Mobile Ads C++ завершает firebase::Future , возвращаемого функцией Initialize() даже если инициализация сети посредничества еще не завершена.
Что произойдет, если некоторые сети-посредники окажутся не готовы к моменту получения обратного вызова инициализации?

Рекомендуется загружать рекламу после завершения инициализации SDK. Даже если посредническая сеть еще не готова, Google Mobile Ads C++ SDK все равно запросит у нее рекламу. Таким образом, если посредническая сеть завершит инициализацию после истечения таймаута, она сможет обрабатывать будущие запросы на рекламу в рамках этой сессии.

Вы можете продолжать опрашивать статус инициализации всех адаптеров на протяжении всей сессии вашего приложения, вызывая GetInitializationStatus() .

Как мне узнать, почему конкретная сеть медиации не готова?

AdapterStatus.description() описывает причину, по которой адаптер не готов обрабатывать рекламные запросы. Пример логирования статуса адаптера медиации можно найти в исходном коде нашего примера быстрого запуска приложения на GitHub.

Дополнительные ресурсы

Пример на GitHub