Desenvolvimento do adaptador de mediação da rede de anúncios

Este guia destina-se a redes de anúncios que procuram criar um adaptador de mediação. Se você é um editor, consulte as instruções de mediação do editor.

Um adaptador de mediação é a camada de comunicação entre sua rede de publicidade e a Mediação de anúncios para dispositivos móveis do Google. Os adaptadores veiculam anúncios da sua rede de anúncios, enquanto encaminham eventos de anúncios relevantes à AdMob. Um adaptador é responsável por implementar o protocolo GADMAdNetworkAdapter para garantir que ele forneça os recursos necessários.

Pré-requisitos

  • Xcode 15.3 ou mais recente
  • Meta de implantação de 8.0 ou mais recente
  • Outros cabeçalhos da pasta "Mediation Adapters" do SDK dos anúncios para dispositivos móveis do Google para iOS

Sua rede de publicidade precisa ter uma relação de trabalho estabelecida com o Google para criar um adaptador de mediação.

Exemplo de rede de anúncios

Este guia demonstra como criar um adaptador para a rede de anúncios de amostra. O SDK de rede de anúncios de amostra contém classes que representam as classes oferecidas pela maioria das redes de anúncios:

@interface SampleBanner : UILabel

@property(nonatomic, copy) NSString *adUnit;
@property(nonatomic, weak) id<SampleBannerAdDelegate> delegate;
- (void)fetchAd:(SampleAdRequest *)request;

@end

typedef NS_ENUM(NSInteger, SampleErrorCode) {
  SampleErrorCodeBadRequest = 0,
  SampleErrorCodeUnknown = 1,
  SampleErrorCodeNetworkError = 2,
  SampleErrorCodeNoInventory = 3,
};

@interface SampleAdRequest : NSObject

@property(nonatomic, assign) BOOL testMode;
@property(nonatomic, copy) NSArray *keywords;

@end

@interface SampleInterstitial : NSObject

@property(nonatomic, copy) NSString *adUnit;
@property(nonatomic, weak) id<SampleInterstitialAdDelegate> delegate;
@property(nonatomic, assign, getter=isInterstitialLoaded) BOOL interstitialLoaded;
- (void)fetchAd:(SampleAdRequest *)request;
- (void)show;

@end

@protocol SampleBannerAdDelegate
- (void)bannerDidLoad:(SampleBanner *)banner;
- (void)banner:(SampleBanner *)banner didFailToLoadAdWithError:(SampleErrorCode)error;
- (void)bannerWillLeaveApplication:(SampleBanner *)banner;

@end

@protocol SampleInterstitialAdDelegate<NSObject>
- (void)interstitialDidLoad:(SampleInterstitial *)interstitial;
- (void)interstitial:(SampleInterstitial *)interstitial
    didFailToLoadAdWithError:(SampleErrorCode)error;
- (void)interstitialWillPresentScreen:(SampleInterstitial *)interstitial;
- (void)interstitialWillDismissScreen:(SampleInterstitial *)interstitial;
- (void)interstitialDidDismissScreen:(SampleInterstitial *)interstitial;
- (void)interstitialWillLeaveApplication:(SampleInterstitial *)interstitial;

@end

Veja a implementação completa do SDK de exemplo para mais informações sobre essas classes.

Conector

Os adaptadores de mediação interagem com o SDK dos anúncios para dispositivos móveis do Google usando um objeto que implementa o protocolo GADMAdNetworkConnector. A partir daqui, chamaremos esse objeto de conector. Ele expõe informações necessárias para solicitações de anúncios e fornece um meio de chamar a mediação para eventos de anúncios e interações do usuário. O conector é fornecido aos adaptadores de mediação no momento da inicialização. Configure o adaptador para armazenar o conector em uma variável de instância:

- (id)initWithGADMAdNetworkConnector:(id<GADMAdNetworkConnector>)c {
  if ((self = [super init])) {
    _connector = c;
  }
  return self;
}

Parâmetros do servidor

Sua rede de publicidade provavelmente precisa de identificadores para identificar um editor. A rede de anúncios de amostra, por exemplo, exige um bloco de anúncios. Esses parâmetros obrigatórios do servidor são fornecidos ao adaptador pelo método credentials, que retorna um NSDictionary de identificadores e valores correspondentes. A linha de código a seguir recupera o parâmetro de servidor chamado ad_unit para a rede de anúncios de amostra do conector:

self.interstitialAd.adUnit = [[self.connector credentials] objectForKey:@"ad_unit"];

Configuração da rede de mediação

As redes de publicidade precisam informar a AdMob sobre os parâmetros de servidor necessários para a rede delas. Isso permite que a AdMob configure sua rede no front-end.

Ao ativar sua rede para mediação no front-end, a AdMob exige que você insira os valores necessários para instanciar o adaptador. A captura de tela abaixo mostra que um identificador de posicionamento do aplicativo (APID, na sigla em inglês) é necessário para a Millennial Media e um ID do app é necessário para a InMobi.

Confira este artigo para mais informações sobre como configurar redes de anúncios de mediação.

Fazer uma solicitação de anúncio de mediação

Nas solicitações de banner de mediação, o método getBannerWithSize é chamado logo após o adaptador ser instanciado. Esse método não retorna nada. Ele sinaliza ao adaptador para iniciar uma busca assíncrona de anúncios na rede. Faça com que o adaptador detecte callbacks para o SDK. Se o SDK não oferecer suporte ao tamanho do anúncio especificado ou não for compatível com anúncios de banner, invoque o método adapter:didFailAd: no conector.

Uma implementação de getBannerWithSize para a rede de anúncios de amostra fica assim:

- (void)getBannerWithSize:(GADAdSize)adSize {
  //The adapter should fail immediately if the adSize is not supported
  if (!GADAdSizeEqualToSize(adSize, GADAdSizeBanner) &&
      !GADAdSizeEqualToSize(adSize, GADAdSizeMediumRectangle) &&
      !GADAdSizeEqualToSize(adSize, GADAdSizeFullBanner) &&
      !GADAdSizeEqualToSize(adSize, GADAdSizeLeaderboard)) {
    NSString *errorDesc =
        [NSString stringWithFormat:@"Invalid ad type %@, not going to get ad.",
                                   NSStringFromGADAdSize(adSize)];
    NSDictionary *errorInfo = [NSDictionary
        dictionaryWithObjectsAndKeys:errorDesc, NSLocalizedDescriptionKey, nil];
    NSError *error = [NSError errorWithDomain:GADErrorDomain
                                         code:GADErrorMediationInvalidAdSize
                                     userInfo:errorInfo];
    [self.connector adapter:self didFailAd:error];
    return;
  }
  self.bannerAd = [[SampleBanner alloc]
      initWithFrame:CGRectMake(0, 0, adSize.size.width, adSize.size.height)];

  self.bannerAd.delegate = self;
  self.bannerAd.adUnit = [[self.connector credentials] objectForKey:@"ad_unit"];

  // Setup request parameters.
  SampleAdRequest *request = [[SampleAdRequest alloc] init];
  request.testMode = self.connector.testMode;
  request.keywords = self.connector.userKeywords;
  [self.bannerAd fetchAd:request];
  NSLog(@"Requesting banner from Sample Ad Network");
}

Outros parâmetros de segmentação

O conector contém algumas informações de segmentação comuns que você pode consultar para a segmentação de anúncios:

  • userKeywords
  • testMode
  • childDirectedTreatment

Extras de mediação

Os extras de mediação permitem que sua rede de publicidade ofereça suporte a parâmetros de segmentação ou entradas extras que não são cobertas pelos parâmetros de solicitação adicionais fornecidos pelo conector. Essa funcionalidade pode ser fornecida por uma classe que implementa o protocolo GADAdNetworkExtras. A classe SampleAdNetworkExtras é mostrada abaixo como um exemplo:

@interface SampleAdNetworkExtras : NSObject <GADAdNetworkExtras>
/// Should ad volume audio be muted.
@property(nonatomic, assign) BOOL muteAudio;

@end

Os editores precisam transmitir uma instância da subclasse GADAdNetworkExtras ao fazer uma solicitação de anúncio. Essa instância da subclasse GADAdNetworkExtras pode ser acessada pelo conector. Veja como você pode usar os extras de mediação ao criar uma solicitação de anúncio para sua rede:

SampleAdRequest *request = [[SampleAdRequest alloc] init];
SampleAdNetworkExtras *myAdNetworkExtras = [self.connector networkExtras];
request.muteAudio = myAdNetworkExtras.muteAudio;
[self.bannerAd fetchAd:request];

Para garantir que a subclasse GADAdNetworkExtras possa ser acessada pelo conector, implemente networkExtrasClass e retorne a subclasse GADAdNetworkExtras:

+ (Class<GADAdNetworkExtras>)networkExtrasClass {
  return [SampleAdNetworkExtras class];
}

Se o adaptador não usar extras de mediação, o método networkExtrasClass retornará Nil.

Notificar mediação

O adaptador deve implementar o listener de anúncios na sua rede e encaminhar os callbacks de eventos de anúncio relevantes pelo conector. A tabela abaixo explica quando chamar cada método delegado:

Método Quando ligar
adapter:didReceiveAdView: A solicitação do banner foi concluída.
adapter:didFailAd: Falha na solicitação do banner.
adapterDidGetAdClick: O banner foi clicado.
adapterWillPresentFullScreenModal: O banner vai apresentar uma sobreposição no app.
adapterWillDismissFullScreenModal: A sobreposição no app será fechada.
adapterDidDismissFullScreenModal: A sobreposição no app foi fechada.
adapterWillLeaveApplication: O aplicativo será colocado em segundo plano ou será encerrado porque o usuário clicou em um anúncio que iniciará outro aplicativo.

O exemplo a seguir implementa a interface SampleBannerAdDelegate da rede de anúncios de amostra para encaminhar mensagens de erro e status:

- (void)bannerDidLoad:(SampleBanner *)banner {
  [self.connector adapter:self didReceiveAdView:banner];
}

- (void)banner:(SampleBanner *)banner didFailWithError:(SampleErrorCode)error {
  [self.connector adapter:self
                didFailAd:[NSError errorWithDomain:@"Ad request failed"
                                              code:error
                                          userInfo:nil]];
}

- (void)bannerWillLeaveApplication:(SampleBanner *)banner {
  [self.connector adapterDidGetAdClick:self];
  [self.connector adapterWillLeaveApplication:self];
}

Iniciar sobreposição no app x aplicativo externo

Quando um banner recebe um clique, o anúncio pode abrir uma sobreposição de tela cheia ou um aplicativo externo (como o Safari ou a app store). Os callbacks do conector que serão invocados nesses dois casos são diferentes.

Se o clique no banner abrir uma sobreposição em tela cheia, chame adapterWillPresentFullScreenModal: ao apresentar a sobreposição. Quando a sobreposição estiver fechada, chame adapterWillDismissFullScreenModal: e adapterDidDismissFullScreenModal:.

Se o clique em um banner (ou um clique em uma sobreposição de tela cheia) fizer com que o usuário saia do aplicativo, invoque o callback adapterWillLeaveApplication:.

Agora você tem um adaptador de mediação para banners funcionando. Para consultar uma implementação completa do SampleAdapter, acesse o GitHub (em inglês).

Implementar um adaptador intersticial

A implementação do adaptador para anúncios intersticiais é semelhante à dos anúncios de banner. O método getInterstitial é chamado imediatamente após o adaptador ser instanciado. Esse método não retorna nada. Espera-se que o adaptador inicie uma busca assíncrona de anúncios na rede. Faça com que o adaptador atue como um delegado ao SDK para detectar callbacks. Se o SDK não aceitar anúncios intersticiais, invoque o método adapter:didFailAd: do conector da seguinte maneira:

- (void)getInterstitial {
  self.interstitialAd = [[SampleInterstitial alloc] init];
  self.interstitialAd.delegate = self;
  self.interstitialAd.adUnit =
      [[self.connector credentials] objectForKey:@"ad_unit"];

  SampleAdRequest *request = [[SampleAdRequest alloc] init];
  // Setup request parameters.
  request.testMode = self.connector.testMode;
  request.keywords = self.connector.userKeywords;

  [self.interstitialAd fetchAd:request];
  NSLog(@"Requesting interstitial from Sample Ad Network");
}

Assim como no MediationBannerAdapter, você pode receber informações de identificação do editor e segmentação de anúncios do conector.

Notificar mediação

O adaptador deve implementar o representante de anúncios para sua rede e encaminhar os callbacks de eventos de anúncio relevantes pelo conector. A tabela abaixo explica quando chamar cada método delegado:

Método Quando ligar
adapterDidReceiveInterstitial: A solicitação do intersticial foi concluída.
adapter:didFailInterstitial: A solicitação do intersticial falhou.
adapterDidGetAdClick: O intersticial foi clicado.
adapterWillPresentInterstitial: O intersticial será exibido.
adapterWillDismissInterstitial: O intersticial será dispensado.
adapterDidDismissInterstitial: O intersticial foi dispensado.
adapterWillLeaveApplication: O aplicativo ficará em segundo plano ou será encerrado porque o usuário clicou em um anúncio que iniciará outro aplicativo.

O exemplo a seguir implementa a interface SampleInterstitialAdDelegate da rede de anúncios de amostra para encaminhar mensagens de erro e status:

- (void)interstitialDidLoad:(SampleInterstitial *)interstitial {
  [self.connector adapterDidReceiveInterstitial:self];
}

- (void)interstitial:(SampleInterstitial *)interstitial
    didFailWithError:(SampleErrorCode)error {
  [self.connector adapter:self
      didFailInterstitial:[NSError errorWithDomain:@"Ad request failed"
                                              code:error
                                          userInfo:nil]];
}

- (void)interstitialWillPresentScreen:(SampleInterstitial *)interstitial {
  [self.connector adapterWillPresentInterstitial:self];
}

- (void)interstitialWillDismissScreen:(SampleInterstitial *)interstitial {
  [self.connector adapterWillDismissInterstitial:self];
}

- (void)interstitialDidDismissScreen:(SampleInterstitial *)interstitial {
  [self.connector adapterDidDismissInterstitial:self];
}

Apresentar um intersticial

Quando o adaptador chamar adapterDidReceiveInterstitial, faça com que ele aguarde para mostrar o intersticial até que presentInterstitialFromRootViewController seja chamado. O desenvolvedor do app decide quando exibir o intersticial, que pode ser vários minutos depois de ele ter sido recebido.

Confira uma implementação de presentInterstitialFromRootViewController: para a rede de anúncios de amostra:

- (void)presentInterstitialFromRootViewController:
    (UIViewController *)rootViewController {
  if ([self.interstitialAd isLoaded]) {
    [self.interstitialAd show];
  }
}

Seu adaptador de mediação está pronto para processar anúncios intersticiais. Para referência, uma implementação completa do SampleAdapter pode ser encontrada no GitHub.

Perguntas frequentes

Devo incluir o adaptador como parte da minha biblioteca do SDK ou como uma biblioteca separada?
Recomendamos incluir o adaptador como parte da biblioteca do SDK para que os desenvolvedores precisem referenciar apenas uma biblioteca para incorporar a rede.
O que devo fazer se meu adaptador só for compatível com anúncios de banner?

Se o adaptador só for compatível com banners, faça com que ele encaminhe um evento de erro para a mediação para solicitações de intersticiais:

- (void)getInterstitial {
  NSDictionary *errorInfo = @{ NSLocalizedDescriptionKey : @"Some error" };
  NSError *error = [NSError errorWithDomain:GADErrorDomain
                                       code:GADErrorInvalidRequest
                                   userInfo:errorInfo];
  [self.connector adapter:self didFailInterstitial:error];
  return;
}
O que devo fazer se meu adaptador só for compatível com anúncios intersticiais?

Se o adaptador só é compatível com intersticiais, ele precisa encaminhar um evento de erro à mediação para solicitações de banner:

- (void)getBannerWithSize:(GADAdSize)adSize {
  NSDictionary *errorInfo = @{ NSLocalizedDescriptionKey : @"Some error" };
  NSError *error =
      [NSError errorWithDomain:GADErrorDomain
                          code:GADErrorInvalidRequest
                      userInfo:errorInfo];
  [self.connector adapter:self didFailAd:error];
  return;
}