Eventos personalizados de anuncios nativos

Requisitos previos

Para implementar eventos personalizados de AdMob, primero debes integrar tanto el SDK de anuncios de Google para móviles como el formato de anuncio nativo en tu aplicación.

Además, es recomendable que leas primero la documentación sobre cómo hacer una AdRequest y cómo funciona la mediación.

SDK de ejemplo

El código utilizado en esta guía se ha extraído de nuestro proyecto de evento personalizado de muestra, que también incluye un SDK de ejemplo. Para que el proyecto ilustrara cómo crear un evento personalizado que medie con el SDK de otra red publicitaria, era necesario un SDK que se hiciera cargo de la mediación, por lo que creamos una simulación llamada "SDK de ejemplo".

El SDK de ejemplo incluye clases similares a las que encontrarías en el SDK de producción de una red publicitaria. Para simular el SDK de una red real, tiene objetos de solicitud como SampleNativeAdRequest, cargadores de anuncios como SampleNativeAdLoader, y otras clases, constantes y protocolos. No obstante, los anuncios que produce son ficticios y no se genera ningún tráfico de red adicional.

Solicitar anuncios nativos

El método requestNativeAdWithParameter:

Las clases de eventos personalizados deben implementar el protocolo GADCustomEventNativeAd, que incluye un método que utiliza el SDK de anuncios de Google para móviles para solicitar anuncios nativos a los eventos personalizados:

Swift

func request(withParameter serverParameter: String,
                                   request: GADCustomEventRequest,
                                   adTypes: [Any],
                                   options: [Any],
                        rootViewController: UIViewController)

Objective-C

- (void)requestNativeAdWithParameter:(NSString *)serverParameter
                             request:(GADCustomEventRequest *)request
                             adTypes:(NSArray *)adTypes
                             options:(NSArray *)options
                  rootViewController:(UIViewController *)rootViewController;

Cuando se llama a este método, el evento personalizado debe solicitar un anuncio nativo de forma asíncrona. Cuatro de los parámetros de requestNativeAdWithParameter: contienen información que el evento personalizado puede usar para hacer la solicitud:

  • serverParameter: al añadir un evento personalizado a la configuración de mediación de un bloque de anuncios, los editores pueden introducir un valor de cadena para que se transfiera con cada solicitud. Este parámetro contiene dicho valor (normalmente, otro ID de bloque de anuncios, emitido por la red con mediación).
  • request: un objeto GADCustomEventRequest que contiene propiedades específicas de una sola solicitud, como los formatos nativos que se solicitan. GADCustomEventRequest también incluye propiedades sobre los datos de segmentación que proporcionan los editores al hacer solicitudes.
  • adTypes: un elemento NSArray que contiene constantes que indican qué formatos nativos se solicitan. En el caso de los objetos GADUnifiedNativeAd, debe contener kGADAdLoaderAdTypeUnifiedNative.
  • options: un elemento NSArray que contiene objetos GADAdLoaderOptions que indican las preferencias de los editores relacionadas con la carga de anuncios.

Además de los parámetros que contienen la información sobre la solicitud, el parámetro rootViewController facilita una referencia al objeto UIViewController en el que debe mostrarse el anuncio.

A continuación, se incluye un fragmento de código de nuestro proyecto de evento personalizado de ejemplo, en el que puedes ver implementado un método requestNativeAdWithParameter::

SampleCustomEventNativeAd (fragmento)

Swift

func request(withParameter serverParameter: String, request: GADCustomEventRequest, adTypes: [Any], options: [Any], rootViewController: UIViewController) {

  let adLoader = SampleNativeAdLoader()
  let sampleRequest = SampleNativeAdRequest()

  if let options = options as? [GADAdLoaderOptions] {
    for loaderOptions: GADAdLoaderOptions in options {
      if let imageOptions = loaderOptions as? GADNativeAdImageAdLoaderOptions {

        sampleRequest.shouldRequestPortraitImages =
        imageOptions.preferredImageOrientation = .portrait;
        sampleRequest.shouldRequestMultipleImages = imageOptions.shouldRequestMultipleImages
        // If the GADNativeAdImageAdLoaderOptions' disableImageLoading
        // property is YES, the adapter should send just the URLs for the images.
        sampleRequest.shouldDownloadImages = !imageOptions.disableImageLoading
      }
      else if let options = loaderOptions as? GADNativeAdViewAdOptions {
        nativeAdViewAdOptions = options
      }
    }
  }
  // This custom event uses the server parameter to carry an ad unit ID,
  // which is the most common use case.
  adLoader.adUnitID = serverParameter
  adLoader.delegate = self
  adLoader.fetchAd(sampleRequest)
}

Objective-C

- (void)requestNativeAdWithParameter:(NSString *)serverParameter
                             request:(GADCustomEventRequest *)request
                             adTypes:(NSArray *)adTypes
                             options:(NSArray *)options
                  rootViewController:(UIViewController *)rootViewController {
  SampleNativeAdLoader *adLoader = [[SampleNativeAdLoader alloc] init];
  SampleNativeAdRequest *sampleRequest = [[SampleNativeAdRequest alloc] init];

  for (GADNativeAdImageAdLoaderOptions *imageOptions in options) {
    if (![imageOptions isKindOfClass:[GADNativeAdImageAdLoaderOptions class]]) {
      continue;
    }

    sampleRequest.shouldRequestPortraitImages =
        imageOptions.preferredImageOrientation ==
        GADNativeAdImageAdLoaderOptionsOrientationPortrait;
    sampleRequest.shouldDownloadImages = !imageOptions.disableImageLoading;
    sampleRequest.shouldRequestMultipleImages = imageOptions.shouldRequestMultipleImages;
  }

  // This custom event uses the server parameter to carry an ad unit ID,
  // which is the most common use case.
  adLoader.adUnitID = serverParameter;
  adLoader.delegate = self;

  [adLoader fetchAd:sampleRequest];
}

Se trata de un evento personalizado de muestra que media con una red publicitaria ficticia a través de un SDK de ejemplo simulado. El evento personalizado utiliza la información proporcionada por los parámetros requestNativeAdWithParameter: para solicitar un anuncio al objeto SampleNativeAdLoader del SDK de ejemplo. También se asigna a sí mismo como delegado del objeto SampleNativeAdLoader, de modo que se puedan reenviar eventos del SDK de ejemplo al SDK de anuncios de Google para móviles. Ese proceso es el tema central de la siguiente sección.

GADAdLoaderOptions

Al solicitar anuncios nativos, los editores proporcionan un array de objetos GADAdLoaderOptions para especificar sus preferencias respecto a la solicitud, como el modo en que se deben devolver los recursos de imagen. Estos, a su vez, se proporcionan a eventos personalizados como uno de los parámetros del método requestNativeAdWithParameter:. Los eventos personalizados deben iterar sobre el array options y actuar de acuerdo con las preferencias que contiene.

Por ejemplo, si el array options contiene un objeto GADNativeAdImageAdLoaderOptions y el valor de shouldDownloadImages es "true", el evento personalizado debe devolver los recursos de imagen, y no solo las URL. En este caso, si el SDK adaptado solo proporciona las URL de las imágenes, el evento personalizado deberá usarlas para descargar los archivos de imagen y poner sus datos a disposición de los editores.

Reenviar eventos al SDK de anuncios de Google para móviles

Cuando un evento personalizado intenta cargar un anuncio nativo de su red con mediación, pueden ocurrir varias cosas: el SDK podría devolver un anuncio nativo correctamente, podría hacerlo con un error o, sencillamente, podría informar de que no hay anuncios disponibles. Es importante que el SDK de anuncios de Google para móviles reciba información sobre esos eventos, por lo que el protocolo GADCustomEventNativeAd incluye un delegado (del tipo GADCustomEventNativeAdDelegate) que el evento personalizado puede usar para reenviarlos.

Una de las funciones de los eventos personalizados es actuar como intermediarios a la espera de recibir eventos del SDK con mediación y, luego, enviar el mensaje del protocolo GADCustomEventNativeAdDelegate correspondiente al delegado, según proceda. El evento personalizado debe estar al tanto de los siguientes mensajes:

  • customEventNativeAd:didReceiveMediatedUnifiedNativeAd:: este mensaje debe enviarse cuando un evento personalizado cargue correctamente un anuncio nativo. Toma un solo parámetro del tipo GADMediatedUnifiedNativeAd, que el evento personalizado debe usar para servir una versión "adaptada" del anuncio nativo que acaba de cargar (las clases GADMediatedUnifiedNativeAd se tratan en la sección siguiente).
  • customEventNativeAd:didFailToLoadWithError:: cuando el evento personalizado intenta cargar un anuncio nativo y no lo consigue, debe utilizar este método para informar del error. Toma un solo parámetro NSError, que debe contener información específica sobre el fallo.

A continuación te mostramos un ejemplo de nuestro proyecto de evento personalizado:

SampleCustomEventNativeAd (fragmento)

Swift

extension SampleCustomEventNativeAdSwift: SampleNativeAdLoaderDelegate {

  func adLoader(_ adLoader: SampleNativeAdLoader, didReceive nativeAd: SampleNativeAd) {
    let mediatedAd = SampleMediatedNativeAdSwift(
    sampleNativeAd:nativeAd,nativeAdViewAdOptions: nativeAdViewAdOptions)
    delegate?.customEventNativeAd(self, didReceive: mediatedAd)
  }

  func adLoader(_ adLoader: SampleNativeAdLoader, didFailToLoadAdWith errorCode: SampleErrorCode) {
    let error = NSError(domain: customEventErrorDomain, code: errorCode.rawValue, userInfo: nil)
    delegate?.customEventNativeAd(self, didFailToLoadWithError: error)
  }

}

Objective-C

@interface SampleCustomEventNativeAd () <SampleNativeAdLoaderDelegate>
@end

@implementation SampleCustomEventNativeAd

@synthesize delegate;

...

#pragma mark SampleNativeAdLoaderDelegate implementation

- (void)adLoader:(SampleNativeAdLoader *)adLoader didReceiveNativeAd:(SampleNativeAd *)nativeAd {
  SampleMediatedNativeAd *mediatedAd =
      [[SampleMediatedNativeAd alloc] initWithSampleNativeAd:nativeAd
                                       nativeAdViewAdOptions:_nativeAdViewAdOptions];
  [self.delegate customEventNativeAd:self didReceiveMediatedUnifiedNativeAd:mediatedAd];
}

- (void)adLoader:(SampleNativeAdLoader *)adLoader
    didFailToLoadAdWithErrorCode:(SampleErrorCode)errorCode {
  NSError *error = [NSError errorWithDomain:customEventErrorDomain code:errorCode userInfo:nil];
  [self.delegate customEventNativeAd:self didFailToLoadWithError:error];
}

...

@end

La clase implementa el protocolo SampleNativeAdLoaderDelegate del SDK de ejemplo. En SampleCustomEventNativeAd.m (fragmento), la propia clase de evento personalizado se asignó al SampleNativeAdLoader como su delegado:

Swift

adLoader.delegate = self

Objective-C

adLoader.delegate = self;

De este modo, nos aseguramos de que el SDK de ejemplo devuelve mensajes al evento personalizado cuando tiene que informar de un fracaso o un éxito. A continuación, el evento personalizado envía el mensaje correspondiente a su propio delegado y reenvía el evento al SDK de anuncios de Google para móviles. Dicho de otra forma, el SDK de anuncios de Google para móviles recibe información del evento personalizado, que, a su vez, recibe información del SDK con mediación.

El método adLoader:didFailToLoadAdWithErrorCode anterior es un buen ejemplo de este proceso. Cuando el SDK de ejemplo no logra cargar un anuncio, envía un mensaje adLoader:didFailToLoadAdWithErrorCode: al evento personalizado. El evento personalizado crea un nuevo objeto NSError con el SampleErrorCode proporcionado por el SDK de ejemplo y, luego, lo envía a su propio delegado a través del mensaje customEventNativeAd:didFailToLoadWithError:. De esta manera, el evento del SDK de ejemplo se transforma en un evento del SDK de anuncios de Google para móviles.

Asignar anuncios nativos

Cada SDK tiene su propio formato de anuncios nativos. Por ejemplo, es posible que uno devuelva objetos que contengan un campo "title", mientras que otros podrían tener un campo "headline". Además, los métodos utilizados para hacer el seguimiento de las impresiones y procesar los clics pueden variar de un SDK a otro. Para unificar estas diferencias, cuando un evento personalizado recibe un objeto de anuncio nativo del SDK de la red publicitaria con mediación, debe usar una subclase de GADMediatedNativeAd para asignar el objeto de anuncio nativo de dicho SDK, de modo que coincida con la interfaz que espera el SDK de anuncios de Google para móviles.

El formato de anuncio nativo unificado de AdMob definido por el sistema tiene su correspondiente clase GADMediatedUnifiedNativeAd. Los eventos personalizados deben crear una subclase para asignar los objetos de anuncios nativos proporcionados por sus SDK con mediación.

Aquí tienes un ejemplo de una clase de asignador de nuestro proyecto de evento personalizado de muestra:

Swift

class SampleMediatedUnifiedNativeAdSwift : NSObject {

    var sampleAd : SampleNativeAd
    var mappedImages = [GADNativeAdImage]()
    var mappedIcon: GADNativeAdImage?
    var extras = [String:Any]()
    var nativeAdViewAdOptions: GADNativeAdViewAdOptions?
    let adInfoView = SampleAdInfoView()
    var sampleMediaView : SampleMediaView?

    init(sampleNativeAd : SampleNativeAd, nativeAdViewAdOptions : GADNativeAdViewAdOptions?) {
      sampleAd = sampleNativeAd
      super.init()
      extras = [SampleCustomEventConstantsSwift.awesomenessKey: sampleAd.degreeOfAwesomeness ?? ""]
      if let image = sampleAd.image {
         mappedImages = [GADNativeAdImage(image : image)]
      }
      else {
         let imageUrl = URL(fileURLWithPath : sampleAd.imageURL)
         mappedImages = [GADNativeAdImage(url : imageUrl, scale : sampleAd.imageScale)]
      }
      if let icon = sampleAd.icon {
        mappedIcon = GADNativeAdImage(image : icon)
      }
      else {
       let iconURL = URL(fileURLWithPath : sampleNativeAd.iconURL)
       mappedIcon = GADNativeAdImage(url : iconURL, scale : sampleAd.iconScale)
      }
      self.nativeAdViewAdOptions = nativeAdViewAdOptions
      self.sampleMediaView = self.sampleAd.mediaView
    }
}

extension SampleMediatedUnifiedNativeAdSwift : GADMediatedUnifiedNativeAd {
    var advertiser : String? {
        return sampleAd.advertiser
    }

    var headline : String? {
      return sampleAd.headline
    }

    var images : [GADNativeAdImage]? {
      return mappedImages
    }

    var body : String? {
      return sampleAd.body
    }

    var icon : GADNativeAdImage? {
      return mappedIcon
    }

    var callToAction : String? {
      return sampleAd.callToAction
    }

    var starRating : NSDecimalNumber? {
      return sampleAd.starRating
    }

    var store : String? {
      return sampleAd.store
    }

    var price : String? {
      return sampleAd.price
    }

    var adChoicesView : UIView? {
      return adInfoView
    }

    var extraAssets : [String : Any]? {
      return extras
    }

    var mediaView : UIView?{
      return self.sampleMediaView!
    }

    var hasVideoContent : Bool {
      return self.sampleAd.mediaView != nil
    }

    func didRecordImpression() {
      sampleAd.recordImpression()
    }

    func didRender(in view: UIView, clickableAssetViews: [GADUnifiedNativeAssetIdentifier : UIView],
                       nonclickableAssetViews: [GADUnifiedNativeAssetIdentifier : UIView],
                               viewController: UIViewController) {
        // This method is called when the native ad view is rendered.
        // Here you would pass the UIView back to the mediated network's SDK.
        self.sampleAd.mediaView.playMedia()
    }

    func didRecordClickOnAsset(withName assetName: GADUnifiedNativeAssetIdentifier, view: UIView, viewController: UIViewController) {
       sampleAd.handleClick(on: view)
    }

    func didUntrackView(_ view: UIView?) {
        // This method is called when the mediatedNativeAd is no longer
        // rendered in the provided view. Here you would remove any
        // tracking from the view that has mediated native ad.
    }

}

Objective-C

    @interface SampleMediatedNativeAd ()
    @property(nonatomic, strong) SampleNativeAd *sampleAd;
    @property(nonatomic, copy) NSArray *mappedImages;
    @property(nonatomic, strong) GADNativeAdImage *mappedIcon;
    @property(nonatomic, copy) NSDictionary *extras;
    @property(nonatomic, strong) GADNativeAdViewAdOptions *nativeAdViewAdOptions;
    @property(nonatomic, strong) SampleAdInfoView *adInfoView;
    @property(nonatomic, strong) SampleMediaView *mediaView;

    @end

    @implementation SampleMediatedNativeAd

    - (instancetype)initWithSampleNativeAd:(SampleNativeAd *)sampleNativeAd
                     nativeAdViewAdOptions:(nullable GADNativeAdViewAdOptions *)nativeAdViewAdOptions {
      if (!sampleNativeAd) {
        return nil;
      }

      self = [super init];
      if (self) {
        _sampleAd = sampleNativeAd;
        _extras = @{SampleCustomEventExtraKeyAwesomeness : _sampleAd.degreeOfAwesomeness};

        if (_sampleAd.image) {
          _mappedImages = @[ [[GADNativeAdImage alloc] initWithImage:_sampleAd.image] ];
        } else {
          NSURL *imageURL = [[NSURL alloc] initFileURLWithPath:_sampleAd.imageURL];
          _mappedImages =
              @[ [[GADNativeAdImage alloc] initWithURL:imageURL scale:_sampleAd.imageScale] ];
        }

        if (_sampleAd.icon) {
          _mappedIcon = [[GADNativeAdImage alloc] initWithImage:_sampleAd.icon];
        } else {
          NSURL *iconURL = [[NSURL alloc] initFileURLWithPath:_sampleAd.iconURL];
          _mappedIcon = [[GADNativeAdImage alloc] initWithURL:iconURL scale:_sampleAd.iconScale];
        }
        _mediaView = _sampleAd.mediaView;
        _nativeAdViewAdOptions = nativeAdViewAdOptions;

        // The sample SDK provides an AdChoices view (SampleAdInfoView).
        // If your SDK provides image and clickthrough URLs for its
        // AdChoices icon instead of an actual UIView, the adapter is
        // responsible for downloading the icon image and creating the
        // AdChoices icon view.
        _adInfoView = [[SampleAdInfoView alloc] init];
      }
      return self;
    }

    - (BOOL)hasVideoContent {
      return self.sampleAd.mediaView != nil;
    }

    - (UIView *)mediaView {
      return _mediaView;
    }

    - (NSString *)advertiser {
      return self.sampleAd.advertiser;
    }

    - (NSString *)headline {
      return self.sampleAd.headline;
    }

    - (NSArray *)images {
      return self.mappedImages;
    }

    - (NSString *)body {
      return self.sampleAd.body;
    }

    - (GADNativeAdImage *)icon {
      return self.mappedIcon;
    }

    - (NSString *)callToAction {
      return self.sampleAd.callToAction;
    }

    - (NSDecimalNumber *)starRating {
      return self.sampleAd.starRating;
    }

    - (NSString *)store {
      return self.sampleAd.store;
    }

    - (NSString *)price {
      return self.sampleAd.price;
    }

    - (NSDictionary *)extraAssets {
      return self.extras;
    }

    - (UIView *)adChoicesView {
      return self.adInfoView;
    }

    // Because the Sample SDK has click and impression tracking via
    // methods on its native ad object which the developer is required
    // to call, there's no need to pass it a reference to the UIView
    // being used to display the native ad. So there's no need to
    // implement mediatedNativeAd:didRenderInView:viewController:clickableAssetViews:nonClickableAssetViews
    // here. If your mediated network does need a reference to the view,
    // this method can be used to provide one. You can also access the
    // clickable and non-clickable views by asset key if the mediation
    // network needs this information.
    - (void)didRenderInView:(UIView *)view
           clickableAssetViews:
               (NSDictionary<GADUnifiedNativeAssetIdentifier, UIView *> *)clickableAssetViews
        nonclickableAssetViews:
            (NSDictionary<GADUnifiedNativeAssetIdentifier, UIView *> *)nonclickableAssetViews
                viewController:(UIViewController *)viewController {
      // This method is called when the native ad view is rendered.
      // Here you would pass the UIView back to the mediated
      // network's SDK.
      // Playing video using SampleNativeAd's playVideo method
      [_sampleAd playVideo];
    }

    - (void)didUntrackView:(UIView *)view {
      // This method is called when the mediatedNativeAd is no longer
      // rendered in the provided view. Here you would remove any
      // tracking from the view that has mediated native ad.
    }

    - (void)didRecordImpression {
      if (self.sampleAd) {
        [self.sampleAd recordImpression];
      }
    }

    - (void)didRecordClickOnAssetWithName:(GADUnifiedNativeAssetIdentifier)assetName
                                     view:(UIView *)view
                           viewController:(UIViewController *)viewController {
      if (self.sampleAd) {
        [self.sampleAd handleClickOnView:view];
      }
    }

    @end

Primero echaremos un vistazo al inicializador y a algunas de las funciones que desempeña.

Incluir referencias a objetos de anuncio nativo con mediación

El inicializador acepta una instancia de SampleNativeAd como primer parámetro. Esta es la clase de anuncio nativo que utiliza el SDK de ejemplo para sus anuncios nativos. Para poder transferir los eventos de clic e impresión, el asignador necesita una referencia al anuncio con mediación, de modo que almacena una como sampleAd. El inicializador también toma una instancia de GADNativeAdViewAdOptions.

Crear un objeto NSDictionary que contenga recursos adicionales

Algunas redes con mediación pueden proporcionar recursos adicionales, aparte de los que se encuentran en los formatos de anuncios nativos de AdMob. El protocolo GADMediatedUnifiedNativeAd incluye un método, denominado extraAssets, que utiliza el SDK de anuncios de Google para móviles para mostrar cualquiera de estos recursos "extra" del asignador.

El inicializador descrito anteriormente crea un objeto NSDictionary y lo rellena con los recursos adicionales proporcionados por el SDK de ejemplo (en este caso, un solo valor NSString llamado degreeOfAwesomeness). Posteriormente, el método extraAssets utiliza NSDictionary como valor devuelto:

Swift

extras = [SampleCustomEventExtraKeyAwesomeness : sampleAd.degreeOfAwesomeness]

Objective-C

_extras = @{SampleCustomEventExtraKeyAwesomeness : _sampleAd.degreeOfAwesomeness};

Asignar recursos de imagen

La asignación de recursos de imagen es más complicada que la de otros tipos de datos más sencillos, como NSString o double. Las imágenes se pueden descargar automáticamente o se pueden devolver simplemente como valores de URL. Su densidad de píxeles también puede variar. Para ayudar a los desarrolladores de eventos personalizados a gestionar todos estos detalles, el SDK de anuncios de Google para móviles proporciona la clase GADNativeAdImage. La información sobre los recursos de imagen, ya se trate de objetos UIImage reales o tan solo de valores NSURL, debe devolverse al SDK de anuncios de Google para móviles mediante esta clase.

A continuación encontrarás una demostración de cómo gestionan las clases de asignación la creación de objetos GADNativeAdImage que contienen imágenes de icono:

Swift

if let icon = sampleAd.icon {
    mappedIcon = GADNativeAdImage(image : icon)
}
else {
    let iconURL = URL(fileURLWithPath : sampleNativeAd.iconURL)
    mappedIcon = GADNativeAdImage(url : iconURL, scale : sampleAd.iconScale)
}

Objective-C

if (_sampleAd.icon) {
   _mappedIcon = [[GADNativeAdImage alloc] initWithImage:_sampleAd.icon];
} else {
   NSURL *iconURL = [[NSURL alloc] initFileURLWithPath:_sampleAd.iconURL];
   _mappedIcon = [[GADNativeAdImage alloc] initWithURL:iconURL scale:_sampleAd.iconScale];
}

Como vimos en la sección sobre cómo hacer solicitudes, los editores pueden usar un objeto GADNativeAdImageAdLoaderOptions para especificar que las imágenes de los anuncios nativos no se deben descargar automáticamente. En este ejemplo, el asignador comprueba si la imagen ya se ha descargado anteriormente y crea un objeto GADNativeAdImage con la información adecuada, ya sea un objeto UIImage o un par coincidente de valores NSURL y de escala.

Eso es todo acerca del inicializador. Ahora, pasemos al trabajo que se lleva a cabo en otros lugares de la clase.

Devolver recursos asignados

Esta clase de asignador hereda métodos de GADMediatedUnifiedNativeAd que se corresponden con los recursos esperados de un anuncio nativo. El SDK de anuncios de Google para móviles realiza llamadas a estos métodos para obtener los recursos, de modo que la clase de asignación devuelva el valor adecuado. Con la mayoría de los recursos, el proceso es bastante sencillo:

Swift

var headline : String? {
  return sampleAd.headline
}

Objective-C

- (NSString *)headline {
  return self.sampleAd.headline;
}

Sin embargo, con otros, los tipos de datos podrían no coincidir o es posible que se necesite algún otro tipo de conversión. La función del asignador es gestionar estas cuestiones y los métodos de los recursos son un buen lugar para ello.

Gestión de anuncios

Tu adaptador es responsable de proporcionar un icono de Gestión de anuncios. adChoicesView es un método opcional del protocolo GADMediatedUnifiedNativeAd. Una vez implementado, el SDK tomará la vista de Gestión de anuncios proporcionada y la mostrará en el anuncio nativo.

A continuación, encontrarás un ejemplo de implementación en el que se muestra cómo proporcionar el icono de Gestión de anuncios:

Swift

class SampleMediatedUnifiedNativeAd: NSObject, GADMediatedUnifiedNativeAd {
  /// Ad networks should provide their own AdChoices view.
  private var adChoicesView: SampleAdChoicesView?

  var adChoicesView : UIView? {
      return adChoicesView
  }

Objective-C

@interface SampleMediatedNativeAd ()<GADMediatedUnifiedNativeAd> {

  /// Ad networks should provide their own AdChoices view.
  SampleAdChoicesView *_adChoicesView;

}

@implementation SampleMediatedNativeAd

- (UIView *)adChoicesView {
  return _adInfoView;
}

Eventos de impresión y de clic

Es importante que el SDK de la red con mediación reciba una notificación cada vez que se produzca una impresión o un clic. Por este motivo, las clases de asignación pueden facilitar al SDK de la red con mediación la información necesaria para que gestione el seguimiento de las impresiones y los clics por su cuenta, o bien informarle explícitamente de cuándo se produce una impresión o un clic.

Si los objetos de anuncios nativos con mediación facilitan métodos para registrar clics e impresiones, las clases de asignación de un evento personalizado pueden utilizarlos. Esta es la estrategia más habitual. GADMediatedUnifiedNativeAd incluye dos métodos, didRecordImpression: y didRecordClickOnAssetWithName:view:viewController:, que los asignadores deben anular y usar para llamar al método correspondiente del objeto de anuncio nativo con mediación.

A continuación te mostramos qué hace SampleMediatedNativeAd para gestionar esta situación:

Swift

func didRecordImpression() {
  sampleAd.recordImpression()
}

func didRecordClickOnAsset(withName assetName: GADUnifiedNativeAssetIdentifier,
                                    view: UIView,
                                    viewController: UIViewController) {
  sampleAd.handleClick(on: view)
}

Objective-C

- (void)didRecordImpression {
  if (self.sampleAd) {
    [self.sampleAd recordImpression];
  }
}

- (void)didRecordClickOnAssetWithName:(GADUnifiedNativeAssetIdentifier)assetName
                                 view:(UIView *)view
                       viewController:(UIViewController *)viewController {
  if (self.sampleAd) {
    [self.sampleAd handleClickOnView:view];
  }
}

Como SampleMediatedNativeAd contiene una referencia al objeto de anuncio nativo del SDK de ejemplo, para informar de un clic o una impresión, el asignador solo tiene que llamar al método correspondiente de ese objeto.

Permitir que el SDK con mediación registre los clics y las impresiones

En el caso de las redes publicitarias que deban registrar los clics y las impresiones por su cuenta, el protocolo GADCustomEventNativeAd ofrece dos mensajes opcionales: handlesUserClicks y handlesUserImpressions. Cuando uno de ellos devuelve el valor YES, significa que el evento personalizado registra ese tipo de operación por su cuenta. Si se devuelve NO o no hay respuesta, significa que el SDK de anuncios de Google para móviles se ocupa de registrar los clics y las impresiones en nombre del evento personalizado, y usa didRecordImpression: y didRecordClickOnAssetWithName: en el objeto GADMediatedUnifiedNativeAd para informar de ellos.

Los eventos personalizados que registran los clics o las impresiones por su cuenta pueden usar el mensaje didRenderInView: del protocolo GADMediatedUnifiedNativeAd para transferir las vistas de anuncios nativos a los objetos de anuncios nativos del SDK con mediación, de modo que dicho SDK pueda usarlas para hacer el seguimiento. El SDK de ejemplo empleado hasta ahora en los ejemplos de código de esta guía no sigue esta estrategia para gestionar los clics y las impresiones, pero, si lo hiciera, el método didRenderInView: tendría el siguiente aspecto:

Swift

func didRender(in view: UIView,
                  clickableAssetViews: [GADUnifiedNativeAssetIdentifier : UIView],
                  nonclickableAssetViews: [GADUnifiedNativeAssetIdentifier : UIView],
                  viewController: UIViewController) {
  sampleAd?.setNativeAdView(view)
}

Objective-C

- (void)didRenderInView:(UIView *)view
       clickableAssetViews:
           (NSDictionary<GADUnifiedNativeAssetIdentifier, UIView *> *)clickableAssetViews
    nonclickableAssetViews:
        (NSDictionary<GADUnifiedNativeAssetIdentifier, UIView *> *)nonclickableAssetViews
            viewController:(UIViewController *)viewController {
  [self.sampleAd setNativeAdView:view];
}

GADMediatedUnifiedNativeAd también incluye didUntrackView:, que se utiliza con la finalidad opuesta. Los eventos personalizados deben implementarlo para retirar cualquier referencia a la vista y, a ser posible, desvincularla del objeto de anuncio nativo.

GADMediatedNativeAdNotificationSource

Para que los anuncios nativos con mediación informen de eventos como la presentación de una pantalla o el registro de un clic, el SDK proporciona la clase GADMediatedNativeAdNotificationSource. Tiene seis métodos de clase, que se corresponden con diferentes eventos del ciclo de vida de un anuncio nativo con mediación, cada uno de los cuales emplea una referencia al objeto de anuncio correspondiente:

  • mediatedNativeAdDidRecordImpression:: este método deben invocarlo los anuncios nativos con mediación de los eventos personalizados que hagan un seguimiento de las impresiones por su cuenta para informar de ellas al SDK de anuncios de Google para móviles. Es obligatorio para crear informes.
  • mediatedNativeAdDidRecordClick:: del mismo modo, los eventos personalizados que hagan un seguimiento de sus propios clics deben hacer que sus anuncios nativos con mediación llamen a este método para informar de que se ha producido un clic.
  • mediatedNativeAdWillPresentScreen:: debe llamarse justo antes de que se abran anuncios nativos con mediación en una pantalla modal dentro de la aplicación.
  • mediatedNativeAdWillDismissScreen:: debe llamarse justo antes de que se cierre la ventana modal que abrió el anuncio nativo con mediación dentro de la aplicación.
  • mediatedNativeAdDidDismissScreen:: debe llamarse justo después de que se cierre la ventana modal que abrió el anuncio nativo con mediación dentro de la aplicación.
  • mediatedNativeAdWillLeaveApplication:: debe llamarse justo antes de que el anuncio nativo con mediación provoque que la aplicación deje de estar en primer plano (por ejemplo, al abrir una URL de destino en Safari).

Usar eventos personalizados

Para usar un evento personalizado, debes añadirlo a la configuración de mediación de un bloque de anuncios. Esta operación se lleva a cabo en la interfaz de AdMob. En el artículo Añadir un evento personalizado, hay instrucciones detalladas sobre cómo editar la configuración de mediación de un bloque de anuncios.

Cuando añadas el evento personalizado a la configuración de mediación de un bloque de anuncios, deberás facilitar tres datos:

  • Class Name: el nombre de la clase del evento personalizado.
  • Label: la etiqueta que quieres que use la interfaz de AdMob para representar el evento personalizado cuando muestre las fuentes de mediación del bloque de anuncios. Solo la verás tú, ya que aparece únicamente en AdMob.com.
  • Parameter: es un valor de cadena que se transfiere al evento personalizado cada vez que se emite una solicitud a este bloque de anuncios. Normalmente, este valor se define como un ID de bloque de anuncios de la red con mediación.

En esta captura de pantalla puedes ver un ejemplo de introducción de un evento personalizado:

Eso es todo. Ya tienes todo lo que necesitas para crear tus propios eventos personalizados de iOS para AdMob.