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

Выберите платформу: Android iOS Unity Flutter

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

Предпосылки

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

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

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

ca-app-pub-3940256099942544/1712485313

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

Дополнительную информацию о работе тестовых объявлений 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.

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

Быстрый

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

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

Чтобы получать уведомления о событиях презентации, необходимо назначить GADFullScreenContentDelegate to the 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: . Для объявлений, показываемых через mediation , порядок обратных вызовов определяется реализацией SDK сторонних рекламных сетей. Для SDK рекламных сетей, предоставляющих один метод делегата с информацией о вознаграждении, адаптер медиации вызывает userDidEarnRewardHandler до adDidDismissFullScreenContent: .

Примеры на GitHub

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

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

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