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

Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.

Объявления с вознаграждением позволяют пользователям взаимодействовать с ними в обмен на вознаграждение в приложении. В этом руководстве показано, как интегрировать объявления с вознаграждением в приложения для 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 . Родительское представление — это ссылка JNI jobject на Android Activity или указатель на iOS UIView .

    // 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 см. в разделе Использование Futures для отслеживания состояния выполнения вызовов методов .

Загрузить объявление

Загрузка рекламы осуществляется с помощью LoadAd() объекта RewardedAd . Метод загрузки требует, чтобы вы инициализировали объект 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 секунд Google Mobile Ads C++ SDK завершает работу firebase::Future , возвращенную Initialize() , даже если сеть агрегатора еще не завершила инициализацию.
Что делать, если некоторые сети агрегатора не готовы, когда я получаю обратный вызов инициализации?

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

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

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

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

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

Пример на Гитхабе