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

Выберите платформу: Android (бета-версия)Новый Android iOS Unity Flutter

Реклама с вознаграждением — это реклама, с которой пользователи могут взаимодействовать в обмен на внутриигровые награды . В этом руководстве показано, как интегрировать рекламу с вознаграждением от AdMob в iOS-приложение. Ознакомьтесь с историями успеха клиентов: пример 1 , пример 2 .

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

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

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

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

ca-app-pub-3940256099942544/1712485313

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

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

Выполнение

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

  • Загрузить рекламу
  • [Необязательно] Проверить обратные вызовы SSV
  • Зарегистрируйтесь для участия в обратном звонке.
  • Показать рекламу и обработать событие получения вознаграждения.

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

Загрузка рекламы осуществляется с помощью метода load(adUnitID:request) класса GADRewardedAd .

Быстрый

func loadRewardedAd() async {
  do {
    rewardedAd = try await RewardedAd.load(
      // Replace this ad unit ID with your own ad unit ID.
      with: "ca-app-pub-3940256099942544/1712485313", request: Request())
    rewardedAd?.fullScreenContentDelegate = self
  } catch {
    print("Rewarded ad failed to load with error: \(error.localizedDescription)")
  }
}

SwiftUI

import GoogleMobileAds

class RewardedViewModel: NSObject, ObservableObject, FullScreenContentDelegate {
  @Published var coins = 0
  private var rewardedAd: RewardedAd?

  func loadAd() async {
    do {
      rewardedAd = try await RewardedAd.load(
        with: "ca-app-pub-3940256099942544/1712485313", request: Request())
      rewardedAd?.fullScreenContentDelegate = self
    } catch {
      print("Failed to load rewarded ad with error: \(error.localizedDescription)")
    }
  }

Objective-C

// Replace this ad unit ID with your own ad unit ID.
[GADRewardedAd loadWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"
              request:[GADRequest request]
    completionHandler:^(GADRewardedAd *ad, NSError *error) {
      if (error) {
        NSLog(@"Rewarded ad failed to load with error: %@", [error localizedDescription]);
        return;
      }
      self.rewardedAd = ad;
      self.rewardedAd.fullScreenContentDelegate = self;
    }];

[Необязательно] Проверка обратных вызовов серверной проверки (SSV)

Приложениям, требующим дополнительных данных в коллбэках проверки на стороне сервера, следует использовать функцию пользовательских данных в объявлениях с вознаграждением. Любое строковое значение, заданное для объекта объявления с вознаграждением, передается в параметр запроса custom_data коллбэка SSV. Если значение пользовательских данных не задано, значение параметра запроса custom_data не будет присутствовать в коллбэке SSV.

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

Быстрый

private func validateServerSideVerification() async {
  do {
    rewardedAd = try await RewardedAd.load(
      // Replace this ad unit ID with your own ad unit ID.
      with: "ca-app-pub-3940256099942544/1712485313", request: Request())
    let options = ServerSideVerificationOptions()
    options.customRewardText = "SAMPLE_CUSTOM_DATA_STRING"
    rewardedAd?.serverSideVerificationOptions = options
  } catch {
    print("Rewarded ad failed to load with error: \(error.localizedDescription)")
  }
}

Objective-C

// Replace this ad unit ID with your own ad unit ID.
[GADRewardedAd loadWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"
                        request:[GADRequest request]
              completionHandler:^(GADRewardedAd *ad, NSError *error) {
                if (error) {
                  NSLog(@"Rewarded ad failed to load with error: %@", error.localizedDescription);
                  return;
                }
                self.rewardedAd = ad;
                GADServerSideVerificationOptions *options =
                    [[GADServerSideVerificationOptions alloc] init];
                options.customRewardString = @"SAMPLE_CUSTOM_DATA_STRING";
                ad.serverSideVerificationOptions = options;
              }];

Замените SAMPLE_CUSTOM_DATA_STRING на ваши пользовательские данные.

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

Для получения уведомлений о событиях презентации необходимо присвоить свойство GADFullScreenContentDelegate возвращаемого объявления свойству fullScreenContentDelegate :

Быстрый

rewardedAd?.fullScreenContentDelegate = self

SwiftUI

rewardedAd?.fullScreenContentDelegate = self

Objective-C

self.rewardedAd.fullScreenContentDelegate = self;

Протокол GADFullScreenContentDelegate обрабатывает обратные вызовы в случае успешного или неудачного показа рекламы, а также при её закрытии. Следующий код демонстрирует реализацию протокола:

Быстрый

func adDidRecordImpression(_ ad: FullScreenPresentingAd) {
  print("\(#function) called.")
}

func adDidRecordClick(_ ad: FullScreenPresentingAd) {
  print("\(#function) called.")
}

func adWillPresentFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("\(#function) called.")
}

func adWillDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("\(#function) called.")
}

func adDidDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("\(#function) called.")
  // Clear the rewarded ad.
  rewardedAd = nil
}

func ad(
  _ ad: FullScreenPresentingAd,
  didFailToPresentFullScreenContentWithError error: Error
) {
  print("\(#function) called with error: \(error.localizedDescription).")
}

SwiftUI

func adDidRecordImpression(_ ad: FullScreenPresentingAd) {
  print("\(#function) called")
}

func adDidRecordClick(_ ad: FullScreenPresentingAd) {
  print("\(#function) called")
}

func ad(
  _ ad: FullScreenPresentingAd,
  didFailToPresentFullScreenContentWithError error: Error
) {
  print("\(#function) called")
}

func adWillPresentFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("\(#function) called")
}

func adWillDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("\(#function) called")
}

func adDidDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("\(#function) called")
  // Clear the rewarded ad.
  rewardedAd = nil
}

Objective-C

- (void)adDidRecordImpression:(id<GADFullScreenPresentingAd>)ad {
  NSLog(@"%s called", __PRETTY_FUNCTION__);
}

- (void)adDidRecordClick:(id<GADFullScreenPresentingAd>)ad {
  NSLog(@"%s called", __PRETTY_FUNCTION__);
}

- (void)adWillPresentFullScreenContent:(id<GADFullScreenPresentingAd>)ad {
  NSLog(@"%s called", __PRETTY_FUNCTION__);
}

- (void)adWillDismissFullScreenContent:(id<GADFullScreenPresentingAd>)ad {
  NSLog(@"%s called", __PRETTY_FUNCTION__);
}

- (void)adDidDismissFullScreenContent:(id<GADFullScreenPresentingAd>)ad {
  NSLog(@"%s called", __PRETTY_FUNCTION__);
  // Clear the rewarded ad.
  self.rewardedAd = nil;
}

- (void)ad:(id)ad didFailToPresentFullScreenContentWithError:(NSError *)error {
  NSLog(@"%s called with error: %@", __PRETTY_FUNCTION__, error.localizedDescription);
}

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

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

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

Приведённый ниже код демонстрирует наилучший способ отображения рекламы с вознаграждением:

Быстрый

rewardedAd.present(from: self) {
  let reward = rewardedAd.adReward
  print("Reward received with currency \(reward.amount), amount \(reward.amount.doubleValue)")

  // TODO: Reward the user.
}

SwiftUI

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

var body: some View {
  VStack(spacing: 20) {
      Button("Watch video for additional 10 coins") {
        viewModel.showAd()
        showWatchVideoButton = false
      }

Покажите рекламное объявление с вознаграждением, используя модель представления:

func showAd() {
  guard let rewardedAd = rewardedAd else {
    return print("Ad wasn't ready.")
  }

  rewardedAd.present(from: nil) {
    let reward = rewardedAd.adReward
    print("Reward amount: \(reward.amount)")
    self.addCoins(reward.amount.intValue)
  }
}

Objective-C

[self.rewardedAd presentFromRootViewController:self
                      userDidEarnRewardHandler:^{
                        GADAdReward *reward = self.rewardedAd.adReward;
                        NSString *rewardMessage = [NSString
                            stringWithFormat:@"Reward received with currency %@ , amount %lf",
                                             reward.type, [reward.amount doubleValue]];
                        NSLog(@"%@", rewardMessage);

                        // TODO: Reward the user.
                      }];

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

Могу ли я получить подробную информацию о вознаграждении за рекламу GADRewardedAd ?
Да, если вам нужна сумма вознаграждения до того, как сработает обратный вызов userDidEarnReward , GADRewardedAd есть свойство adReward , которое вы можете проверить, чтобы узнать сумму вознаграждения после загрузки объявления.
Предусмотрен ли тайм-аут для вызова инициализации?
Через 10 секунд Google Mobile Ads SDK вызывает метод GADInitializationCompletionHandler , переданный в метод startWithCompletionHandler: даже если инициализация сети посредничества еще не завершена.
Что произойдет, если некоторые сети-посредники окажутся не готовы к моменту получения обратного вызова инициализации?

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

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

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

Свойство description объекта GADAdapterStatus описывает причину, по которой адаптер не готов обрабатывать рекламные запросы.

Всегда ли обработчик завершения userDidEarnRewardHandler вызывается до метода делегата adDidDismissFullScreenContent: :?

Для рекламы Google все вызовы userDidEarnRewardHandler происходят до вызова adDidDismissFullScreenContent: Для рекламы, показываемой через медиацию , порядок обратных вызовов определяется реализацией SDK рекламной сети стороннего разработчика. Для SDK рекламных сетей, предоставляющих один метод делегата с информацией о вознаграждении, адаптер медиации вызывает userDidEarnRewardHandler до вызова adDidDismissFullScreenContent:

Примеры на GitHub

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

Следующие шаги

Узнайте больше о конфиденциальности пользователей .