Desarrollo de adaptadores de mediación de redes de publicidad

Esta guía está diseñada para redes de publicidad en las que se intenta compilar un adaptador de mediación. Si eres un editor, consulta las instrucciones sobre la mediación para editores.

Un adaptador de mediación es la capa de comunicación entre tu red de publicidad y la mediación de los anuncios móviles de Google. Los adaptadores publican anuncios de tu red de publicidad y reenvían eventos de anuncios relevantes a AdMob. Un adaptador es responsable de implementar el protocolo GADMAdNetworkAdapter para garantizar que proporciona las capacidades necesarias.

Requisitos previos

  • Xcode 15.3 o una versión más reciente
  • Destino de implementación de 8.0 o superior
  • Encabezados adicionales de la carpeta Mediation Adapters de la descarga del SDK de iOS para los anuncios de Google para dispositivos móviles

Tu red de publicidad debe tener una relación de trabajo establecida con Google para crear un adaptador de mediación.

Red de publicidad de muestra

Esta guía muestra cómo crear un adaptador para la red de publicidad de muestra. El SDK de la red de publicidad de muestra contiene clases que representan las clases que ofrecen la mayoría de las redes de publicidad:

@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

Consulta la implementación completa del SDK de muestra para obtener más información sobre estas clases.

Conector

Los adaptadores de mediación se comunican con el SDK de anuncios de Google para dispositivos móviles mediante un objeto que implementa el protocolo GADMAdNetworkConnector. De ahora en adelante, lo llamaremos conector a este objeto. El conector expone la información necesaria para las solicitudes de anuncios y proporciona un medio para llamar a la mediación para interacciones de usuarios y eventos de anuncios. El conector se proporciona a los adaptadores de mediación en el momento de la inicialización. Configura tu adaptador para almacenar el conector en una variable de instancia:

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

Parámetros del servidor

Es probable que tu red de publicidad necesite identificadores para identificar a un publicador. La red de publicidad de muestra, por ejemplo, requiere una unidad de anuncios. Estos parámetros de servidor obligatorios se proporcionan al adaptador a través del método credentials, que muestra un NSDictionary de identificadores y valores correspondientes. La siguiente línea de código recupera el parámetro de servidor llamado ad_unit para la red de publicidad de muestra del conector:

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

Configuración de la red de mediación

Las redes de publicidad deben informar a AdMob de los parámetros de servidor requeridos para su red. Esto permite que AdMob configure tu red en el frontend.

Cuando habilitas tu red para la mediación en el frontend, AdMob requiere que ingreses los valores necesarios para crear una instancia de tu adaptador. La siguiente captura de pantalla muestra que se requiere un identificador de posición de aplicaciones (APID) para Millennial Media y un ID de app para InMobi.

Consulta este artículo para obtener más información sobre la configuración de las redes de publicidad de mediación.

Cómo realizar una solicitud de anuncio de mediación

Para las solicitudes de banners de mediación, se llama al método getBannerWithSize inmediatamente después de que se crea una instancia del adaptador. Este método no devuelve nada. Le indica al adaptador que inicie una recuperación de anuncios asíncrona en la red. Haz que tu adaptador escuche las devoluciones de llamada de tu SDK. Si tu SDK no admite el tamaño de anuncio determinado o no admite anuncios de banner, invoca el método adapter:didFailAd: en el conector.

Una implementación de getBannerWithSize para la red de publicidad de muestra se ve de la siguiente manera:

- (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");
}

Parámetros de segmentación adicionales

El conector contiene información de segmentación común a la que puedes hacer referencia para la segmentación de anuncios:

  • userKeywords
  • testMode
  • childDirectedTreatment

Elementos de mediación adicionales

Los elementos adicionales de mediación permiten que tu red de publicidad admita entradas o parámetros de segmentación adicionales que no están cubiertos por los parámetros de solicitud adicionales que proporciona el conector. Esta funcionalidad se puede proporcionar a través de una clase que implementa el protocolo GADAdNetworkExtras. La clase SampleAdNetworkExtras se muestra a continuación como ejemplo:

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

@end

Los publicadores deben pasar una instancia de tu subclase GADAdNetworkExtras cuando realizan una solicitud de anuncio. Se puede acceder a esta instancia de la subclase GADAdNetworkExtras a través del conector. A continuación, te mostramos cómo puedes usar elementos adicionales de mediación cuando creas una solicitud de anuncio para tu red:

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

Para asegurarte de que se pueda acceder a tu subclase GADAdNetworkExtras a través del conector, implementa networkExtrasClass y muestra la subclase GADAdNetworkExtras:

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

Si tu adaptador no usa elementos adicionales de mediación, el método networkExtrasClass muestra Nil.

Notificar a la mediación

Haz que tu adaptador implemente el objeto de escucha de anuncios para tu red y reenvíe las devoluciones de llamada de eventos de anuncios relevantes a través del conector. En la siguiente tabla, se explica cuándo llamar a cada método delegado:

Método Cuándo llamar
adapter:didReceiveAdView: La solicitud del banner se realizó correctamente.
adapter:didFailAd: Se produjo un error en la solicitud del banner.
adapterDidGetAdClick: Se hizo clic en el banner.
adapterWillPresentFullScreenModal: El banner presentará una superposición en la app.
adapterWillDismissFullScreenModal: Se cerrará la superposición en la app.
adapterDidDismissFullScreenModal: Se cerró la superposición en la app.
adapterWillLeaveApplication: La aplicación se colocará en segundo plano o se cerrará porque el usuario hizo clic en un anuncio que iniciará otra aplicación.

En el siguiente ejemplo, se implementa la interfaz SampleBannerAdDelegate de la red de publicidad de muestra para reenviar mensajes de error y de estado:

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

Lanzamiento de superposiciones integradas en la app en comparación con apps externas

Cuando se hace clic en un banner, el anuncio puede abrir una superposición de pantalla completa o una aplicación externa (como Safari o App Store). Las devoluciones de llamada del conector que se invocarán en estos dos casos son diferentes.

Si un clic en un banner abre una superposición de pantalla completa, llama a adapterWillPresentFullScreenModal: cuando presentes la superposición. Cuando se cierre la superposición, llama a adapterWillDismissFullScreenModal: y adapterDidDismissFullScreenModal:.

Si un clic en un banner (o un clic en una superposición de pantalla completa) hace que el usuario abandone la aplicación, invoca la devolución de llamada adapterWillLeaveApplication:.

Ahora tienes un adaptador de mediación que funciona para banners. A modo de referencia, puedes encontrar una implementación completa de SampleAdapter en GitHub.

Cómo implementar un adaptador intersticial

La implementación del adaptador para anuncios intersticiales es similar a la de anuncios de banner. Se llama inmediatamente al método getInterstitial después de que se crea una instancia del adaptador. Este método no devuelve nada. Se espera que el adaptador inicie una recuperación de anuncios asíncrona por toda la red. Haz que el adaptador actúe como un delegado de tu SDK para escuchar las devoluciones de llamada. Si tu SDK no admite anuncios intersticiales, invoca el método adapter:didFailAd: del conector de la siguiente manera:

- (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");
}

Al igual que con MediationBannerAdapter, puedes recibir información de la identificación del publicador y de la segmentación de anuncios desde el conector.

Notificar a la mediación

Haz que tu adaptador implemente el delegado de anuncio para tu red y reenvíe las devoluciones de llamada de eventos de anuncios relevantes a través del conector. En la siguiente tabla, se explica cuándo llamar a cada método delegado:

Método Cuándo llamar
adapterDidReceiveInterstitial: La solicitud intersticial se realizó correctamente.
adapter:didFailInterstitial: Falló la solicitud intersticial.
adapterDidGetAdClick: Se hizo clic en el intersticial.
adapterWillPresentInterstitial: Se mostrará el intersticial.
adapterWillDismissInterstitial: Se descartará el intersticial.
adapterDidDismissInterstitial: Se descartó el intersticial.
adapterWillLeaveApplication: La aplicación se ejecutará en segundo plano o se cerrará porque el usuario hizo clic en un anuncio que iniciará otra aplicación.

En el siguiente ejemplo, se implementa la interfaz SampleInterstitialAdDelegate de la red de publicidad de muestra para reenviar mensajes de error y de estado:

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

Cómo presentar un anuncio intersticial

Una vez que el adaptador llame a adapterDidReceiveInterstitial, haz que espere para mostrar el intersticial hasta que se llame a presentInterstitialFromRootViewController. El desarrollador de la app decide cuándo mostrar el anuncio intersticial. Esto puede ser varios minutos después de que se recibió.

A continuación, se muestra una implementación de presentInterstitialFromRootViewController: para la red de publicidad de muestra:

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

Tu adaptador de mediación está listo para administrar anuncios intersticiales. A modo de referencia, puedes encontrar una implementación completa de SampleAdapter en GitHub.

Preguntas frecuentes

¿Debo incluir el adaptador como parte de mi biblioteca de SDK o como una biblioteca independiente?
Recomendamos incluir el adaptador como parte de tu biblioteca de SDK, de modo que los desarrolladores deban hacer referencia solo a una biblioteca para incorporar tu red.
¿Qué debo hacer si mi adaptador solo admite anuncios de banner?

Si tu adaptador solo admite banners, haz que reenvíe un evento de error a la mediación para las solicitudes intersticiales:

- (void)getInterstitial {
  NSDictionary *errorInfo = @{ NSLocalizedDescriptionKey : @"Some error" };
  NSError *error = [NSError errorWithDomain:GADErrorDomain
                                       code:GADErrorInvalidRequest
                                   userInfo:errorInfo];
  [self.connector adapter:self didFailInterstitial:error];
  return;
}
¿Qué debo hacer si mi adaptador solo admite anuncios intersticiales?

Si tu adaptador solo admite anuncios intersticiales, haz que reenvíe un evento de error a la mediación para las solicitudes 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;
}