Eventos personalizados para anuncios de banner e intersticiales

Esta guía está dirigida a los editores que quieran añadir eventos personalizados de banner e intersticiales a la mediación de AdMob.

Con los eventos personalizados puedes incluir la vista que quieras en tu espacio publicitario, así como monetizar tu aplicación con redes publicitarias que no sean directamente compatibles con la mediación. Un evento personalizado se implementa mediante los protocolos GADCustomEventBanner o GADCustomEventInterstitial.

Requisitos previos

Para poder integrar eventos personalizados de anuncios de banner o intersticiales, primero debes incorporar ese formato de anuncio en tu aplicación. Estas son las guías más importantes al respecto:

Red publicitaria de ejemplo

En esta guía se explica cómo publicar anuncios de banner e intersticiales desde la red publicitaria de ejemplo mediante las clases de eventos personalizados SampleCustomEventBanner y SampleCustomEventInterstital. El SDK de la red publicitaria de ejemplo es ficticio y se ha desarrollado para ilustrar el proceso real de implementación de un evento personalizado. Contiene clases representativas de las que ofrecen la mayoría de las redes publicitarias. Consulta la implementación completa del SDK de ejemplo para obtener más información acerca de estas clases.

En el siguiente ejemplo, primero deberás crear un evento de banner personalizado en la mediación de AdMob. Para ello, tendrás que definir un evento personalizado que dirija a esa clase específica en tu aplicación a través de la UI de AdMob. Después, deberás implementar un evento de banner personalizado para devolver una vista.

Definir un evento personalizado

Los eventos personalizados se deben definir en la UI de AdMob. En el artículo Añadir un evento personalizado encontrarás instrucciones sobre cómo desplazarte por la UI.

En esta captura de pantalla se muestran algunos ejemplos de ajustes de eventos personalizados:

La tabla que aparece a continuación te servirá de orientación cuando vayas a rellenar estos parámetros.

Nombre de clase

Escribe el nombre completo de la clase que implementa el evento personalizado.

Si el lenguaje con el que has implementado tu clase es Swift, debes añadir al nombre de la clase un prefijo que indique el módulo de la aplicación o del framework (por ejemplo, appName.className).

Si el proyecto tiene varios destinos o no se llama igual que el destino seleccionado, debes indicar el nombre del destino en cuestión. Con el nombre de destino, el aspecto sería el siguiente: appName_targetName.className. Además, recuerda que tienes que sustituir todos los caracteres no alfanuméricos, como los guiones, por guiones bajos.

Para obtener más información, consulta este ejemplo.

Etiqueta Introduce un nombre descriptivo para el evento.
Parámetro Si quieres transferir un argumento al evento personalizado, introduce la cadena correspondiente.

Solicitar un banner

En las solicitudes de banner de los eventos personalizados, se realiza una llamada al método requestBannerAd:parameter:label:request: inmediatamente después de que se cree la instancia de la clase de evento personalizado. Este método no devuelve nada, ya que se presupone que el evento personalizado obtendrá el anuncio de forma asíncrona a través de la red. El evento personalizado debe actuar como delegado del SDK para recibir las retrollamadas.

Si el SDK no es compatible con el tamaño de anuncio indicado ni con los anuncios de banner, realiza una llamada al método customEventBanner:didFailAd: del delegado de evento personalizado. Los parámetros serverParameter y serverLabel se corresponden con los campos de parámetros y etiquetas definidos al crear un evento personalizado en la UI de AdMob.

A continuación se muestra un ejemplo de implementación de requestBannerAd:parameter:label:request: mediante la red publicitaria de ejemplo:

Swift

func requestBannerAd(adSize: GADAdSize, parameter serverParameter: String!,
    label serverLabel: String!, request: GADCustomEventRequest!) {
  // Create a banner view with the appropriate size.
  bannerAd = SampleBanner(frame: CGRectMake(
      0, 0, adSize.size.width, adSize.size.height))
  bannerAd.delegate = self
  bannerAd.adUnit = serverParameter
  let adRequest = SampleAdRequest()
  adRequest.testMode = request.isTesting
  adRequest.keywords = request.userKeywords
  bannerAd.fetchAd(adRequest)
}

Objective‑C

- (void)requestBannerAd:(GADAdSize)adSize
              parameter:(NSString *)serverParameter
                  label:(NSString *)serverLabel
                request:(GADCustomEventRequest *)request {
  // Create the bannerView with the appropriate size.
  self.bannerAd =
      [[SampleBanner alloc] initWithFrame:CGRectMake(0,
                                                     0,
                                                     adSize.size.width,
                                                     adSize.size.height)];

  self.bannerAd.delegate = self;
  self.bannerAd.adUnit = serverParameter;
  SampleAdRequest *adRequest = [[SampleAdRequest alloc] init];
  adRequest.testMode = request.isTesting;
  adRequest.keywords = request.userKeywords;
  [self.bannerAd fetchAd:adRequest];
}

Enviar parámetros adicionales de la red publicitaria en las solicitudes de eventos personalizados

Para enviar parámetros adicionales de la red publicitaria junto con la solicitud que debe gestionar el evento personalizado, tienes que utilizar la función GADRequest registerAdNetworkExtras:. Debes crear una instancia de GADCustomEventExtras (que se ajuste al protocolo GADAdNetworkExtras) para que se rellene una propiedad GADCustomEventRequest.additionalParameters. Para transferir los parámetros adicionales, realiza una llamada al método GADCustomEventExtras setExtras:forLabel: y transfiere los parámetros como un diccionario y la etiqueta del evento personalizado que hayas definido en la UI de AdMob.

En este fragmento de código puedes ver cómo se transmite un parámetro SampleExtra a nuestra etiqueta SampleCustomEvent definida anteriormente:

Swift

let request = GADRequest()
let extras = GADCustomEventExtras()
extras.setExtras(["SampleExtra": true], forLabel: "SampleCustomEvent")
request.register(extras)

Objective‑C

GADRequest *request = [GADRequest request];
GADCustomEventExtras *extras = [[GADCustomEventExtras alloc] init];
[extras setExtras:@{@"SampleExtra": @(YES)} forLabel:@"SampleCustomEvent"];
[request registerAdNetworkExtras:extras];

Si no registras una instancia de GADCustomEventExtras para una solicitud de evento personalizado, el valor de la propiedad additionalParameters de GADCustomEventRequest será nil.

Notificar a la mediación de AdMob

Implementa el procesador de anuncios de tu red e invoca las retrollamadas pertinentes en el delegado del evento personalizado para devolver mensajes a la mediación. En el siguiente ejemplo se implementa la interfaz SampleBannerAdDelegate de la red publicitaria de ejemplo para enviar estos mensajes:

Swift

/// Type property for Sample Ad Network custom event error domain.
static let customEventErrorDomain = "com.google.CustomEvent"

// Sent when banner ad has loaded.
func bannerDidLoad(banner: SampleBanner!) {
  delegate.customEventBanner(self, didReceiveAd: banner)
}

// Sent when banner has failed to load.
func banner(banner: SampleBanner!, didFailToLoadAdWithErrorCode error: SampleErrorCode) {
  let nsError = NSError(domain: SampleCustomEventBanner.customEventErrorDomain,
      code: error.rawValue, userInfo: nil)
  delegate.customEventBanner(self, didFailAd: nsError)
}

// Sent when a banner is clicked and an external application is launched
func bannerWillLeaveApplication(banner: SampleBanner!) {
  delegate.customEventBannerWasClicked(self)
  delegate.customEventBannerWillLeaveApplication(self)
}

Objective‑C

/// Constant for Sample Ad Network custom event error domain.
static NSString *const customEventErrorDomain = @"com.google.CustomEvent";

// Sent when banner ad has loaded.
- (void)bannerDidLoad:(SampleBanner *)banner {
  [self.delegate customEventBanner:self didReceiveAd:banner];
}

// Sent when banner has failed to load.
- (void)banner:(SampleBanner *)banner
    didFailToLoadAdWithErrorCode:(SampleErrorCode)errorCode {
  NSError *error = [NSError errorWithDomain:customEventErrorDomain
                                       code:errorCode
                                   userInfo:nil];
  [self.delegate customEventBanner:self didFailAd:error];
}

// Sent when a banner is clicked and an external application is launched.
- (void)bannerWillLeaveApplication:(SampleBanner *)banner {
  [self.delegate customEventBannerWasClicked:self];
  [self.delegate customEventBannerWillLeaveApplication:self];
}

La mediación de AdMob admite las siguientes retrollamadas:

Método Cuándo llamarlo
customEventBanner:didReceiveAd: La solicitud de banner se ha realizado correctamente.
customEventBanner:didFailAd: Se ha producido un error al realizar la solicitud de banner.
customEventBannerWillPresentModal: El banner presentará una vista modal de pantalla completa.
customEventBannerWillDismissModal: El banner cerrará una vista modal de pantalla completa.
customEventBannerDidDismissModal: El banner ha cerrado una vista modal de pantalla completa.
customEventBannerWillLeaveApplication: El banner ha provocado que el usuario salga de la aplicación.
customEventBannerWasClicked: Se ha hecho clic en el banner.

Anuncios intersticiales

Método Cuándo llamarlo
customEventInterstitial:DidReceiveAd: La solicitud de intersticial se ha realizado correctamente.
customEventInterstitial:didFailAd: Se ha producido un error al realizar la solicitud de intersticial.
customEventInterstitialWillPresent: Se mostrará el intersticial, presentando una vista modal de pantalla completa.
customEventInterstitialWillDismiss: El intersticial cerrará una vista modal de pantalla completa.
customEventInterstitialDidDismiss: El intersticial ha cerrado una vista modal de pantalla completa.
customEventInterstitialWillLeaveApplication: El intersticial ha provocado que el usuario salga de la aplicación.
customEventInterstitialWasClicked: Se ha hecho clic en el intersticial.

Para obtener más información, consulta la implementación de ejemplo de un banner de evento personalizado.

Evento de intersticial personalizado

Los eventos de intersticial personalizados se implementan de forma similar a los eventos de banner personalizados, con la principal diferencia de que la clase de los primeros debe seguir el protocolo GADCustomEventInterstitial en lugar de GADCustomEventBanner.

Definir un evento personalizado

Los eventos personalizados se deben definir en la UI de AdMob. En el artículo Añadir un evento personalizado encontrarás instrucciones sobre cómo desplazarte por la UI.

En esta captura de pantalla se muestran algunos ejemplos de ajustes de eventos personalizados:

La tabla que aparece a continuación te servirá de orientación cuando vayas a rellenar estos parámetros.

Nombre de clase

Escribe el nombre completo de la clase que implementa el evento personalizado.

Si el lenguaje con el que has implementado tu clase es Swift, debes añadir al nombre de la clase un prefijo que indique el módulo de la aplicación o del framework (por ejemplo, appName.className).

Si el proyecto tiene varios destinos o no se llama igual que el destino seleccionado, debes indicar el nombre del destino en cuestión. Con el nombre de destino, el aspecto sería el siguiente: appName_targetName.className. Además, recuerda que tienes que sustituir todos los caracteres no alfanuméricos, como los guiones, por guiones bajos.

Para obtener más información, consulta este ejemplo.

Etiqueta Introduce un nombre descriptivo para el evento.
Parámetro Si quieres transferir un argumento al evento personalizado, introduce la cadena correspondiente.

Solicitar un intersticial

En las solicitudes de intersticiales de los eventos personalizados, se realiza una llamada al método requestInterstitialAdWithParameter:label:request: inmediatamente después de que se cree una instancia de la clase de evento personalizado. Este método no devuelve nada, ya que se presupone que el evento personalizado obtendrá el anuncio de forma asíncrona a través de la red.

El evento personalizado debe actuar como delegado del SDK para recibir las retrollamadas. Los parámetros serverParameter y serverLabel se corresponden con los campos de parámetros y etiquetas definidos al crear un evento personalizado en la UI de AdMob.

A continuación se muestra un ejemplo de implementación de requestInterstitialAdWithParameter:label:request: mediante la red publicitaria de ejemplo:

Swift

func requestInterstitialAdWithParameter(serverParameter: String!,
    label serverLabel: String!, request: GADCustomEventRequest!) {
  interstitial = SampleInterstitial()
  interstitial.delegate = self
  interstitial.adUnit = serverParameter
  let adRequest = SampleAdRequest()
  adRequest.testMode = request.isTesting
  adRequest.keywords = request.userKeywords
  interstitial.fetchAd(adRequest)
}

Objective‑C

- (void)requestInterstitialAdWithParameter:(NSString *)serverParameter
                                     label:(NSString *)serverLabel
                                   request:(GADCustomEventRequest *)request {
  self.interstitial = [[SampleInterstitial alloc] init];
  self.interstitial.delegate = self;
  self.interstitial.adUnit = serverParameter;
  SampleAdRequest *adRequest = [[SampleAdRequest alloc] init];
  adRequest.testMode = request.isTesting;
  adRequest.keywords = request.userKeywords;
  [self.interstitial fetchAd:adRequest];
}

El protocolo de eventos personalizados GADCustomEventInterstitial requiere que implementes el método presentFromRootViewController:. Cuando solicitas al SDK de anuncios de Google para móviles que muestre el intersticial, la mediación invoca dicho método de la siguiente manera:

Swift

func presentFromRootViewController(rootViewController: UIViewController!) {
  if interstitial.interstitialLoaded {
    interstitial.show()
  }
}

Objective‑C

- (void)presentFromRootViewController:(UIViewController *)rootViewController {
  if ([self.interstitial isInterstitialLoaded]) {
    [self.interstitial show];
  }
}

Enviar parámetros adicionales de la red publicitaria en las solicitudes de eventos personalizados

Para enviar parámetros adicionales de la red publicitaria junto con la solicitud que debe gestionar el evento personalizado, tienes que utilizar la función GADRequest registerAdNetworkExtras:. Debes crear una instancia de GADCustomEventExtras (que se ajuste al protocolo GADAdNetworkExtras) para que se rellene una propiedad GADCustomEventRequest.additionalParameters. Para transferir los parámetros adicionales, realiza una llamada al método GADCustomEventExtras setExtras:forLabel: y transfiere los parámetros como un diccionario y la etiqueta del evento personalizado que hayas definido en la UI de AdMob.

En el siguiente fragmento de código se muestra cómo transferir un parámetro SampleExtra de la etiqueta SampleCustomEvent que hemos definido anteriormente:

Swift

let request = GADRequest()
let extras = GADCustomEventExtras()
extras.setExtras(["SampleExtra": true], forLabel: "SampleCustomEvent")
request.register(extras)

Objective‑C

GADRequest *request = [GADRequest request];
GADCustomEventExtras *extras = [[GADCustomEventExtras alloc] init];
[extras setExtras:@{@"SampleExtra": @(YES)} forLabel:@"SampleCustomEvent"];
[request registerAdNetworkExtras:extras];

Si no registras una instancia de GADCustomEventExtras para una solicitud de evento personalizado, el valor de la propiedad additionalParameters de GADCustomEventRequest será nil.

Notificar a la mediación de AdMob

Al igual que con el evento de banner personalizado, debes implementar el procesador de anuncios de tu red para enviar mensajes de vuelta a la mediación. En el siguiente ejemplo se muestra la implementación de la interfaz SampleInterstitialAdDelegate de la red publicitaria de ejemplo:

Swift

/// Type property for Sample Ad Network custom event error domain.
static let customEventErrorDomain = "com.google.CustomEvent"

// Sent when an interstitial ad has loaded.
func interstitialDidLoad(interstitial: SampleInterstitial!) {
  delegate.customEventInterstitialDidReceiveAd(self)
}

// Sent when interstitial ad has failed to load.
func interstitial(interstitial: SampleInterstitial!,
    didFailToLoadAdWithErrorCode errorCode: SampleErrorCode) {
  let nsError = NSError(domain: SampleCustomEventInterstitial.customEventErrorDomain,
      code: errorCode.rawValue, userInfo: nil)
  delegate.customEventInterstitial(self, didFailAd: nsError)
}

// Sent when an interstitial is about to be shown.
func interstitialWillPresentScreen(interstitial: SampleInterstitial!) {
  delegate.customEventInterstitialWillPresent(self)
}

// Sent when an interstitial is about to be dismissed.
func interstitialWillDismissScreen(interstitial: SampleInterstitial!) {
  delegate.customEventInterstitialWillDismiss(self)
}

// Sent when an interstitial has been dismissed.
func interstitialDidDismissScreen(interstitial: SampleInterstitial!) {
  delegate.customEventInterstitialDidDismiss(self)
}

// Sent when an interstitial is clicked and an external application is launched.
func interstitialWillLeaveApplication(interstitial: SampleInterstitial!) {
  delegate.customEventInterstitialWasClicked(self)
  delegate.customEventInterstitialWillLeaveApplication(self)
}

Objective‑C

/// Constant for Sample Ad Network custom event error domain.
static NSString *const customEventErrorDomain = @"com.google.CustomEvent";

// Sent when an interstitial ad has loaded.
- (void)interstitialDidLoad:(SampleInterstitial *)interstitial {
  [self.delegate customEventInterstitialDidReceiveAd:self];
}

// Sent when an interstitial ad has failed to load.
- (void)interstitial:(SampleInterstitial *)interstitial
    didFailToLoadAdWithErrorCode:(SampleErrorCode)errorCode {
  NSError *error = [NSError errorWithDomain:customEventErrorDomain
                                       code:errorCode
                                   userInfo:nil];
  [self.delegate customEventInterstitial:self didFailAd:error];
}

// Sent when an interstitial is about to be shown.
- (void)interstitialWillPresentScreen:(SampleInterstitial *)interstitial {
  [self.delegate customEventInterstitialWillPresent:self];
}

// Sent when an interstitial is about to be dismissed.
- (void)interstitialWillDismissScreen:(SampleInterstitial *)interstitial {
  [self.delegate customEventInterstitialWillDismiss:self];
}

// Sent when an interstitial has been dismissed.
- (void)interstitialDidDismissScreen:(SampleInterstitial *)interstitial {
  [self.delegate customEventInterstitialDidDismiss:self];
}

// Sent when an interstitial is clicked and an external application is launched.
- (void)interstitialWillLeaveApplication:(SampleInterstitial *)interstitial {
  [self.delegate customEventInterstitialWasClicked:self];
  [self.delegate customEventInterstitialWillLeaveApplication:self];
}

El envío de mensajes a la mediación permite que prosiga el flujo de mediación.

Para obtener más información, consulta este ejemplo de implementación de un evento intersticial personalizado.