Специальные события для объявлений с вознаграждением

Выберите платформу: Android iOS Android (устаревшая версия)

Требования

Настройте специальные события.

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

Когда в цепочке медиации с каскадной загрузкой будет достигнута позиция для специального события, для названия класса, указанного при создании специального события, будет вызван метод loadRewarded:adConfiguration:completionHandler:. В этом случае метод находится в SampleCustomEvent, который затем вызывает метод loadRewarded:adConfiguration:completionHandler: в SampleCustomEventRewarded.

Чтобы запросить объявление с вознаграждением, создайте или измените класс, реализующий GADMediationAdapter и loadRewarded:adConfiguration:completionHandler:. Если класс, который расширяет GADMediationAdapter, уже существует, реализуйте loadRewarded:adConfiguration:completionHandler: в нем. Кроме того, создайте новый класс, чтобы реализовать GADMediationRewardedAd.

В нашем примере специального события SampleCustomEvent реализует интерфейс GADMediationAdapter, а затем делегирует его SampleCustomEventRewarded.

Swift

import GoogleMobileAds

class SampleCustomEvent: NSObject, MediationAdapter {

  fileprivate var rewardedAd: SampleCustomEventRewarded?
  ...

  func loadRewarded(
    for adConfiguration: MediationRewardedAdConfiguration,
    completionHandler: @escaping GADMediationRewardedLoadCompletionHandler
  ) {
    self.rewardedAd = SampleCustomEventRewarded()
    self.rewardedAd?.loadRewarded(
      for: adConfiguration, completionHandler: completionHandler)
  }
}

Objective-C

#import "SampleCustomEvent.h"

@implementation SampleCustomEvent
...

SampleCustomEventRewarded *sampleRewarded;

- (void)loadRewardedForAdConfiguration:
            (GADMediationRewardedAdConfiguration *)adConfiguration
                     completionHandler:
                         (GADMediationRewardedLoadCompletionHandler)
                             completionHandler {
  sampleRewarded = [[SampleCustomEventRewarded alloc] init];
  [sampleRewarded loadRewardedForAdConfiguration:adConfiguration
                               completionHandler:completionHandler];
}

SampleCustomEventRewarded отвечает за следующие задачи:

  • Загрузка объявления с вознаграждением.

  • Реализация протокола GADMediationRewardedAd.

  • Получение и передача в Google Mobile Ads SDK обратных вызовов событий, связанных с рекламой.

Необязательный параметр, заданный в интерфейсе Менеджера рекламы, включается в конфигурацию объявления. Доступ к параметру можно получить через adConfiguration.credentials.settings[@"parameter"]. Обычно этот параметр представляет собой идентификатор рекламного блока, который требуется SDK рекламной сети при создании объекта объявления.

Swift

class SampleCustomEventRewarded: NSObject, MediationRewardedAd {
  /// The Sample Ad Network rewarded ad.
  var nativeAd: SampleRewarded?

  /// The ad event delegate to forward ad rendering events to Google Mobile Ads SDK.
  var delegate: MediationRewardedAdEventDelegate?

  /// Completion handler called after ad load.
  var completionHandler: GADMediationRewardedLoadCompletionHandler?

  func loadRewarded(
    for adConfiguration: MediationRewardedAdConfiguration,
    completionHandler: @escaping GADMediationRewardedLoadCompletionHandler
  ) {
    rewarded = SampleRewarded.init(
      adUnitID: adConfiguration.credentials.settings["parameter"] as? String)
    rewarded?.delegate = self
    let adRequest = SampleAdRequest()
    adRequest.testMode = adConfiguration.isTestRequest
    self.completionHandler = completionHandler
    rewarded?.fetchAd(adRequest)
  }
}

Objective-C

#import "SampleCustomEventRewarded.h"

@interface SampleCustomEventRewarded () <SampleRewardedAdDelegate,
                                         GADMediationRewardedAd> {
  /// The sample rewarded ad.
  SampleRewarded *_rewardedAd;

  /// The completion handler to call when the ad loading succeeds or fails.
  GADMediationRewardedLoadCompletionHandler _loadCompletionHandler;

  /// The ad event delegate to forward ad rendering events to Google Mobile Ads SDK.
  id <GADMediationRewardedAdEventDelegate> _adEventDelegate;
}
@end

- (void)loadRewardedAdForAdConfiguration:(GADMediationRewardedAdConfiguration *)adConfiguration
                       completionHandler:
                           (GADMediationRewardedLoadCompletionHandler)completionHandler {
  __block atomic_flag completionHandlerCalled = ATOMIC_FLAG_INIT;
  __block GADMediationRewardedLoadCompletionHandler originalCompletionHandler =
      [completionHandler copy];

  _loadCompletionHandler = ^id<GADMediationRewardedAdEventDelegate>(
      _Nullable id<GADMediationRewardedAd> ad, NSError *_Nullable error) {
    // Only allow completion handler to be called once.
    if (atomic_flag_test_and_set(&completionHandlerCalled)) {
      return nil;
    }

    id<GADMediationRewardedAdEventDelegate> delegate = nil;
    if (originalCompletionHandler) {
      // Call original handler and hold on to its return value.
      delegate = originalCompletionHandler(ad, error);
    }

    // Release reference to handler. Objects retained by the handler will also be released.
    originalCompletionHandler = nil;

    return delegate;
  };

  NSString *adUnit = adConfiguration.credentials.settings[@"parameter"];
  _rewardedAd = [[SampleRewardedAd alloc] initWithAdUnitID:adUnit];
  _rewardedAd.delegate = self;
  SampleAdRequest *adRequest = [[SampleAdRequest alloc] init];
  adRequest.testMode = adConfiguration.isTestRequest;
  [_rewardedAd fetchAd:adRequest];
}

Независимо от того, будет ли объявление получено успешно или возникнет ошибка, вызовите функцию GADMediationRewardedLoadCompletionHandler. В случае успеха передайте класс, реализующий GADMediationRewardedAd, со значением nil для параметра error. В случае ошибки передайте возникшую ошибку.

Как правило, эти методы реализуются в обратных вызовах из стороннего SDK, который реализует ваш адаптер. В этом примере в Sample SDK есть SampleRewardedAdDelegate с нужными функциями обратного вызова:

Swift

func rewardedDidLoad(_ interstitial: SampleRewarded) {
  if let handler = completionHandler {
    delegate = handler(self, nil)
  }
}

func rewarded(
  rewarded: SampleRewarded, didFailToLoadAdWith errorCode: SampleErrorCode
) {
  let error =
    SampleCustomEventUtils.SampleCustomEventErrorWithCodeAndDescription(
      code: SampleCustomEventErrorCode
        .SampleCustomEventErrorAdLoadFailureCallback,
      description:
        "Sample SDK returned an ad load failure callback with error code: \(errorCode)"
    )
  if let handler = completionHandler {
    delegate = handler(nil, error)
  }
}

Objective-C

- (void)rewardedDidLoad:(SampleRewarded *)rewarded {
  _adEventDelegate = _loadCompletionHandler(self, nil);
}

- (void)rewarded:(SampleInterstitial *)rewarded
    didFailToLoadAdWithErrorCode:(SampleErrorCode)errorCode {
  NSError *error = SampleCustomEventErrorWithCodeAndDescription(
      SampleCustomEventErrorAdLoadFailureCallback,
      [NSString stringWithFormat:@"Sample SDK returned an ad load failure "
                                 @"callback with error code: %@",
                                 errorCode]);
  _adEventDelegate = _loadCompletionHandler(nil, error);
}

Для показа объявлений в GADMediationrewardedAd необходимо реализовать метод present(viewController:):

Swift

func present(from viewController: UIViewController) {
  if let rewarded = rewarded, rewarded.isRewardedLoaded {
    rewarded.show()
  }
}

Objective-C

- (void)presentFromViewController:(UIViewController *)viewController {
  if ([_rewardedAd isRewardedLoaded]) {
    [_rewardedAd show];
  } else {
    NSError *error = SampleCustomEventErrorWithCodeAndDescription(
        SampleCustomEventErrorAdNotLoaded,
        [NSString stringWithFormat:
                      @"The rewarded ad failed to present because the ad was not loaded."]);
    [_adEventDelegate didFailToPresentWithError:error]
  }
}

Как пересылать события медиации в Google Mobile Ads SDK

После того как вы вызовете GADMediationRewardedLoadCompletionHandler с загруженным объявлением, возвращенный объект делегата GADMediationRewardedAdEventDelegate может быть использован адаптером для пересылки событий показа из стороннего SDK в Google Mobile Ads SDK. Класс SampleCustomEventRewarded реализует протокол SampleRewardedAdDelegate для пересылки обратных вызовов из образца рекламной сети в Google Mobile Ads SDK.

Важно, чтобы ваше специальное событие пересылало как можно больше этих обратных вызовов, чтобы ваше приложение получало эквивалентные события от Google Mobile Ads SDK. Пример использования функций обратного вызова:

Swift

func rewardedAdDidPresent(_ rewarded: SampleRewardedAd) {
  delegate?.willPresentFullScreenVideo()
  delegate?.didStartVideo()
}

func rewardedAdUserDidEarnReward(_ rewarded: SampleRewardedAd) {
  AdReward aReward = AdReward("", rewarded)
  delegate.didRewardUser()
}

Objective-C

- (void)rewardedAdDidPresent:(SampleRewardedAd *)rewardedAd {
  [_adEventDelegate willPresentFullScreenView];
  [_adEventDelegate didStartVideo];
}

- (void)rewardedAd:(nonnull SampleRewardedAd *)rewardedAd
    userDidEarnReward:(NSUInteger)reward {
  GADAdReward *aReward = [[GADAdReward alloc]
      initWithRewardType:@""
            rewardAmount:[NSDecimalNumber numberWithUnsignedInt:reward]];
  [_adEventDelegate didRewardUserWithReward];
}

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