Eventos personalizados de anúncios de banner

Pré-requisitos

Conclua a configuração de eventos personalizados.

Solicitar um anúncio de banner

Quando o item de linha do evento personalizado é alcançado na cadeia de mediação em hierarquia, the loadBanner:adConfiguration:completionHandler: method é chamado no nome da classe fornecido ao criar um evento personalizado. Nesse caso, esse método está em SampleCustomEvent, que chama the loadBanner:adConfiguration:completionHandler: method em SampleCustomEventBanner.

Para solicitar um anúncio de banner, crie ou modifique uma classe que implemente GADMediationAdapter e loadBanner:adConfiguration:completionHandler:. Se uma classe que estende GADMediationAdapter já existir, implemente loadBanner:adConfiguration:completionHandler: nela. Além disso, crie uma nova classe para implementar GADMediationBannerAd.

Em nosso exemplo de evento personalizado, SampleCustomEvent implementa the GADMediationAdapter interface e, em seguida, delega para SampleCustomEventBanner.

Swift

import GoogleMobileAds

class SampleCustomEvent: NSObject, GADMediationAdapter {

  fileprivate var bannerAd: SampleCustomEventBanner?
  ...

  func loadBanner(
    for adConfiguration: GADMediationBannerAdConfiguration,
    completionHandler: @escaping GADMediationBannerLoadCompletionHandler
  ) {
    self.bannerAd = SampleCustomEventBanner()
    self.bannerAd?.loadBanner(
      for: adConfiguration, completionHandler: completionHandler)
  }
}

Objective-C

#import "SampleCustomEvent.h"

@implementation SampleCustomEvent
...

SampleCustomEventBanner *sampleBanner;

- (void)loadBannerForAdConfiguration:
            (GADMediationBannerAdConfiguration *)adConfiguration
                   completionHandler:(GADMediationBannerLoadCompletionHandler)
                                         completionHandler {
  sampleBanner = [[SampleCustomEventBanner alloc] init];
  [sampleBanner loadBannerForAdConfiguration:adConfiguration
                           completionHandler:completionHandler];
}

OSampleCustomEventBanner é responsável pelas seguintes tarefas:

  • Carregar o anúncio de banner e invocarGADMediationBannerLoadCompletionHandler method após a conclusão do carregamento

  • Implementar o GADMediationBannerAd protocol

  • Receber e relatar callbacks de eventos de anúncios para o SDK dos anúncios para dispositivos móveis do Google.

O parâmetro opcional definido na interface AdMob é incluído na configuração do anúncio. O parâmetro pode ser acessado usando adConfiguration.credentials.settings[@"parameter"]. Esse parâmetro normalmente é um identificador de bloco de anúncios exigido por um SDK de rede de publicidade ao instanciar um objeto de anúncio.

Swift

class SampleCustomEventBanner: NSObject, GADMediationBannerAd {
  /// The Sample Ad Network banner ad.
  var bannerAd: SampleBanner?

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

  /// Completion handler called after ad load
  var completionHandler: GADMediationBannerLoadCompletionHandler?

  func loadBanner(
    for adConfiguration: GADMediationBannerAdConfiguration,
    completionHandler: @escaping GADMediationBannerLoadCompletionHandler
  ) {
    // Create the bannerView with the appropriate size.
    let adSize = adConfiguration.adSize
    bannerAd = SampleBanner(
      frame: CGRect(x: 0, y: 0, width: adSize.size.width, height: adSize.size.height))
    bannerAd?.delegate = self
    bannerAd?.adUnit = adConfiguration.credentials.settings["parameter"] as? String
    let adRequest = SampleAdRequest()
    adRequest.testMode = adConfiguration.isTestRequest
    self.completionHandler = completionHandler
    bannerAd?.fetchAd(adRequest)
  }
}

Objective-C

#import "SampleCustomEventBanner.h"

@interface SampleCustomEventBanner () <SampleBannerAdDelegate,
                                       GADMediationBannerAd> {
  /// The sample banner ad.
  SampleBanner *_bannerAd;

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

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

@implementation SampleCustomEventBanner

- (void)loadBannerForAdConfiguration:
            (GADMediationBannerAdConfiguration *)adConfiguration
                   completionHandler:(GADMediationBannerLoadCompletionHandler)
                                         completionHandler {
  __block atomic_flag completionHandlerCalled = ATOMIC_FLAG_INIT;
  __block GADMediationBannerLoadCompletionHandler originalCompletionHandler =
      [completionHandler copy];

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

    id<GADMediationBannerAdEventDelegate> 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"];
  _bannerAd = [[SampleBanner alloc]
      initWithFrame:CGRectMake(0, 0, adConfiguration.adSize.size.width,
                               adConfiguration.adSize.size.height)];
  _bannerAd.adUnit = adUnit;
  _bannerAd.delegate = self;
  SampleAdRequest *adRequest = [[SampleAdRequest alloc] init];
  adRequest.testMode = adConfiguration.isTestRequest;
  [_bannerAd fetchAd:adRequest];
}

Independentemente de o anúncio ser buscado ou encontrar um erro, você chama GADMediationBannerLoadCompletionHandler. Em caso de sucesso, transmita a classe que implementa GADMediationBannerAd com um valor nil para o parâmetro de erro. Em caso de falha, transmita o erro encontrado.

Normalmente, esses métodos são implementados dentro de callbacks do SDK de terceiros implementado pelo adaptador. Neste exemplo, o SDK de amostra tem um SampleBannerAdDelegate com callbacks relevantes:

Swift

func bannerDidLoad(_ banner: SampleBanner) {
  if let handler = completionHandler {
    delegate = handler(self, nil)
  }
}

func banner(
  _ banner: SampleBanner, didFailToLoadAdWith errorCode: SampleErrorCode
) {
  let error =
    SampleCustomEventUtilsSwift.SampleCustomEventErrorWithCodeAndDescription(
      code: SampleCustomEventErrorCodeSwift
        .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)bannerDidLoad:(SampleBanner *)banner {
  _adEventDelegate = _loadCompletionHandler(self, nil);
}

- (void)banner:(SampleBanner *)banner
    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);
}

GADMediationBannerAd requer a implementação de uma propriedade UIView:

Swift

var view: UIView {
  return bannerAd ?? UIView()
}

Objective-C

- (nonnull UIView *)view {
  return _bannerAd;
}

Encaminhar eventos de mediação ao SDK dos anúncios para dispositivos móveis do Google

Depois de chamar GADMediationBannerLoadCompletionHandler com um anúncio carregado, o objeto delegado GADMediationBannerAdEventDelegate retornado pode ser usado pelo adaptador para encaminhar eventos de apresentação do SDK de terceiros ao SDK dos anúncios para dispositivos móveis do Google. A classe SampleCustomEventBanner implementa o protocolo SampleBannerAdDelegate para encaminhar callbacks da rede de publicidade de amostra ao SDK dos anúncios para dispositivos móveis do Google.

É importante que seu evento personalizado encaminhe o maior número possível desses callbacks para que seu app receba esses eventos equivalentes do SDK dos anúncios para dispositivos móveis do Google. Confira um exemplo de como usar callbacks:

Swift

func bannerWillLeaveApplication(_ banner: SampleBanner) {
  delegate?.reportClick()
}

Objective-C

- (void)bannerWillLeaveApplication:(SampleBanner *)banner {
  [_adEventDelegate reportClick];
}

Isso conclui a implementação dos eventos personalizados para anúncios de banner. O exemplo completo está disponível no GitHub (link em inglês). Você pode usá-lo com uma rede de publicidade que já é compatível ou modificá-lo para exibir anúncios de banner de eventos personalizados.