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

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

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

Предпосылки

Всегда тестируйте тестовые объявления

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

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

ca-app-pub-3940256099942544/1712485313

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

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

Реализация

Основные шаги по интеграции межстраничных объявлений с вознаграждением следующие:

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

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

Загрузка объявления выполняется с помощью статического loadWithAdUnitID:request:completionHandler: класса GADRewardedAd . Для метода загрузки требуется идентификатор вашего рекламного блока, объект GADRequest и обработчик завершения, который вызывается при успешной или неудачной загрузке объявления. Загруженный объект GADRewardedAd предоставляется в качестве параметра в обработчике завершения. В приведенном ниже примере показано, как загрузить GADRewardedAd в класс ViewController .

Быстрый

import GoogleMobileAds
import UIKit

class ViewController: UIViewController {

  private var rewardedAd: GADRewardedAd?

  func loadRewardedAd() {
    let request = GADRequest()
    GADRewardedAd.load(withAdUnitID:"ca-app-pub-3940256099942544/1712485313",
                       request: request,
                       completionHandler: { [self] ad, error in
      if let error = error {
        print("Failed to load rewarded ad with error: \(error.localizedDescription)")
        return
      }
      rewardedAd = ad
      print("Rewarded ad loaded.")
    }
    )
  }
}

Цель-C

@import GoogleMobileAds;
@import UIKit;

@interface ViewController ()

@property(nonatomic, strong) GADRewardedAd *rewardedAd;

@end

@implementation ViewController
- (void)loadRewardedAd {
  GADRequest *request = [GADRequest request];
  [GADRewardedAd
       loadWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"
                request:request
      completionHandler:^(GADRewardedAd *ad, NSError *error) {
        if (error) {
          NSLog(@"Rewarded ad failed to load with error: %@", [error localizedDescription]);
          return;
        }
        self.rewardedAd = ad;
        NSLog(@"Rewarded ad loaded.");
      }];
}

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

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

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

Быстрый

GADRewardedInterstitialAd.load(withAdUnitID:"ca-app-pub-3940256099942544/1712485313",
                       request: request,
                       completionHandler: { [self] ad, error in
      if let error != error {
      rewardedInterstitialAd = ad
      let options = GADServerSideVerificationOptions()
      options.customRewardString = "SAMPLE_CUSTOM_DATA_STRING"
      rewardedInterstitialAd.serverSideVerificationOptions = options
    }

Цель-C

GADRequest *request = [GADRequest request];
[GADRewardedInterstitialAd
     loadWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"
              request:request
    completionHandler:^(GADRewardedInterstitialAd *ad, NSError *error) {
      if (error) {
        // Handle Error
        return;
      }
      self.rewardedInterstitialAd = ad;
      GADServerSideVerificationOptions *options =
          [[GADServerSideVerificationOptions alloc] init];
      options.customRewardString = @"SAMPLE_CUSTOM_DATA_STRING";
      ad.serverSideVerificationOptions = options;
    }];

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

Чтобы получать уведомления о событиях презентации, необходимо реализовать протокол GADFullScreenContentDelegate и назначить его свойству fullScreenContentDelegate возвращенного объявления. Протокол GADFullScreenContentDelegate обрабатывает обратные вызовы, когда реклама показывается успешно или неудачно, а также когда она отклоняется. В следующем коде показано, как реализовать протокол и назначить его объявлению:

Быстрый

class ViewController: UIViewController, GADFullScreenContentDelegate {

  private var rewardedAd: GADRewardedAd?

  func loadRewardedAd() {
    let request = GADRequest()
    GADRewarded.load(withAdUnitID:"ca-app-pub-3940256099942544/1712485313",
                     request: request,
                     completionHandler: { [self] ad, error in
      if let error = error {
        print("Failed to load rewarded ad with error: \(error.localizedDescription)")
        return
      }
      rewardedAd = ad
      print("Rewarded ad loaded.")
      rewardedAd?.fullScreenContentDelegate = self
    }
    )
  }

  /// Tells the delegate that the ad failed to present full screen content.
  func ad(_ ad: GADFullScreenPresentingAd, didFailToPresentFullScreenContentWithError error: Error) {
    print("Ad did fail to present full screen content.")
  }

  /// Tells the delegate that the ad will present full screen content.
  func adWillPresentFullScreenContent(_ ad: GADFullScreenPresentingAd) {
    print("Ad will present full screen content.")
  }

  /// Tells the delegate that the ad dismissed full screen content.
  func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
    print("Ad did dismiss full screen content.")
  }
}

Цель-C

@interface ViewController ()<GADFullScreenContentDelegate>

@property(nonatomic, strong) GADRewardedAd *rewardedAd;

@end

@implementation ViewController
- (void)loadRewardedAd {
  GADRequest *request = [GADRequest request];
  [GADRewardedAd
       loadWithAdUnitID:@"ca-app-pub-3940256099942544/4806952744"
                request:request
      completionHandler:^(GADRewardedAd *ad, NSError *error) {
        if (error) {
          NSLog(@"Rewarded ad failed to load with error: %@", [error localizedDescription]);
          return;
        }
        self.rewardedAd = ad;
        NSLog(@"Rewarded ad loaded.");
        self.rewardedAd.fullScreenContentDelegate = self;
      }];
}

/// Tells the delegate that the ad failed to present full screen content.
- (void)ad:(nonnull id<GADFullScreenPresentingAd>)ad
    didFailToPresentFullScreenContentWithError:(nonnull NSError *)error {
    NSLog(@"Ad did fail to present full screen content.");
}

/// Tells the delegate that the ad will present full screen content.
- (void)adWillPresentFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
    NSLog(@"Ad will present full screen content.");
}

/// Tells the delegate that the ad dismissed full screen content.
- (void)adDidDismissFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
    NSLog(@"Ad did dismiss full screen content.");
}

GADRewardedAd — это одноразовый объект. Это означает, что после показа объявления с вознаграждением его нельзя показать снова. Лучшей практикой является загрузка другого объявления с вознаграждением в adDidDismissFullScreenContent: в GADFullScreenContentDelegate , чтобы следующее объявление с вознаграждением начинало загружаться сразу после закрытия предыдущего.

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

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

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

В следующем коде представлен лучший способ отображения рекламы с вознаграждением.

Быстрый

func show() {
  if let ad = rewardedAd {
    ad.present(fromRootViewController: self) {
      let reward = ad.adReward
      print("Reward received with currency \(reward.amount), amount \(reward.amount.doubleValue)")
      // TODO: Reward the user.
    }
  } else {
    print("Ad wasn't ready")
  }
}

Цель-C

- (void)show {
  ...
  if (self.rewardedAd) {
    [self.rewardedAd presentFromRootViewController:self
                                  userDidEarnRewardHandler:^{
                                  GADAdReward *reward =
                                      self.rewardedAd.adReward;
                                  // TODO: Reward the user!
                                }];
  } else {
    NSLog(@"Ad wasn't ready");
  }
}

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

Могу ли я получить информацию о вознаграждении за 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

  • Пример объявлений с вознаграждением: Swift | Цель-C