Requisitos previos
Completa la configuración de eventos personalizados.
Cómo solicitar un anuncio nativo
Cuando se alcanza la línea de pedido del evento personalizado en la cadena de mediación en cascada,
se llama al método loadNativeAd:adConfiguration:completionHandler:
en la
de clase que proporcionaste al crear una
evento. En este caso, ese método está en SampleCustomEvent
, que luego llama al método loadNativeAd:adConfiguration:completionHandler:
en SampleCustomEventNative
.
Para solicitar un anuncio nativo, crea o modifica una clase que implemente
GADMediationAdapter
y loadNativeAd:adConfiguration:completionHandler:
. Si
ya existe una clase que extiende GADMediationAdapter
; implementa
loadNativeAd:adConfiguration:completionHandler:
. Además, crea
Nueva clase para implementar GADMediationNativeAd
.
En nuestro ejemplo de evento personalizado,
SampleCustomEvent
implementa
la interfaz GADMediationAdapter
y, luego, delega a
SampleCustomEventNative
Swift
import GoogleMobileAds class SampleCustomEvent: NSObject, GADMediationAdapter { fileprivate var nativeAd: SampleCustomEventNativeAd? func loadNativeAd( for adConfiguration: GADMediationNativeAdConfiguration, completionHandler: @escaping GADMediationNativeAdLoadCompletionHandler ) { self.nativeAd = SampleCustomEventNativeAd() self.nativeAd?.loadNativeAd( for: adConfiguration, completionHandler: completionHandler) } }
Objective-C
#import "SampleCustomEvent.h" @implementation SampleCustomEvent SampleCustomEventNativeAd *sampleNativeAd; - (void)loadNativeAdForAdConfiguration: (GADMediationNativeAdConfiguration *)adConfiguration completionHandler: (GADMediationNativeAdLoadCompletionHandler) completionHandler { sampleNative = [[SampleCustomEventNativeAd alloc] init]; [sampleNative loadNativeAdForAdConfiguration:adConfiguration completionHandler:completionHandler]; }
SampleCustomEventNative` es responsable de las siguientes tareas:
Cómo cargar el anuncio nativo
Implementar el protocolo
GADMediationNativeAd
Cómo recibir e informar devoluciones de llamadas de eventos de anuncios al SDK de anuncios de Google para dispositivos móviles
El parámetro opcional definido en la IU de Ad Manager es
incluidas en la configuración del anuncio.
Se puede acceder al parámetro
adConfiguration.credentials.settings[@"parameter"]
Este parámetro es
por lo general, es un identificador de unidades de anuncios que requiere un SDK de red de publicidad cuando
un objeto de anuncio.
Swift
class SampleCustomEventNativeAd: NSObject, GADMediationNativeAd { /// The Sample Ad Network native ad. var nativeAd: SampleNativeAd? /// The ad event delegate to forward ad rendering events to the Google Mobile /// Ads SDK. var delegate: GADMediationNativeAdEventDelegate? /// Completion handler called after ad load var completionHandler: GADMediationNativeLoadCompletionHandler? func loadNativeAd( for adConfiguration: GADMediationNativeAdConfiguration, completionHandler: @escaping GADMediationNativeLoadCompletionHandler ) { let adLoader = SampleNativeAdLoader() let sampleRequest = SampleNativeAdRequest() // The Google Mobile Ads SDK requires the image assets to be downloaded // automatically unless the publisher specifies otherwise by using the // GADNativeAdImageAdLoaderOptions object's disableImageLoading property. If // your network doesn't have an option like this and instead only ever // returns URLs for images (rather than the images themselves), your adapter // should download image assets on behalf of the publisher. This should be // done after receiving the native ad object from your network's SDK, and // before calling the connector's adapter:didReceiveMediatedNativeAd: method. sampleRequest.shouldDownloadImages = true sampleRequest.preferredImageOrientation = NativeAdImageOrientation.any sampleRequest.shouldRequestMultipleImages = false let options = adConfiguration.options for loaderOptions: GADAdLoaderOptions in options { if let imageOptions = loaderOptions as? GADNativeAdImageAdLoaderOptions { 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 mediaOptions = loaderOptions as? GADNativeAdMediaAdLoaderOptions { switch mediaOptions.mediaAspectRatio { case GADMediaAspectRatio.landscape: sampleRequest.preferredImageOrientation = NativeAdImageOrientation.landscape case GADMediaAspectRatio.portrait: sampleRequest.preferredImageOrientation = NativeAdImageOrientation.portrait default: sampleRequest.preferredImageOrientation = NativeAdImageOrientation.any } } } // This custom event uses the server parameter to carry an ad unit ID, which // is the most common use case. adLoader.delegate = self adLoader.adUnitID = adConfiguration.credentials.settings["parameter"] as? String self.completionHandler = completionHandler adLoader.fetchAd(sampleRequest) } }
Objective-C
#import "SampleCustomEventNativeAd.h" @interface SampleCustomEventNativeAd () <SampleNativeAdDelegate, GADMediationNativeAd> { /// The sample native ad. SampleNativeAd *_nativeAd; /// The completion handler to call when the ad loading succeeds or fails. GADMediationNativeLoadCompletionHandler _loadCompletionHandler; /// The ad event delegate to forward ad rendering events to the Google Mobile /// Ads SDK. id<GADMediationNativeAdEventDelegate> _adEventDelegate; } @end - (void)loadNativeAdForAdConfiguration: (GADMediationNativeAdConfiguration *)adConfiguration completionHandler:(GADMediationNativeLoadCompletionHandler) completionHandler { __block atomic_flag completionHandlerCalled = ATOMIC_FLAG_INIT; __block GADMediationNativeLoadCompletionHandler originalCompletionHandler = [completionHandler copy]; _loadCompletionHandler = ^id<GADMediationNativeAdEventDelegate>( _Nullable id<GADMediationNativeAd> ad, NSError *_Nullable error) { // Only allow completion handler to be called once. if (atomic_flag_test_and_set(&completionHandlerCalled)) { return nil; } id<GADMediationNativeAdEventDelegate> 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; }; SampleNativeAdLoader *adLoader = [[SampleNativeAdLoader alloc] init]; SampleNativeAdRequest *sampleRequest = [[SampleNativeAdRequest alloc] init]; // The Google Mobile Ads SDK requires the image assets to be downloaded // automatically unless the publisher specifies otherwise by using the // GADNativeAdImageAdLoaderOptions object's disableImageLoading property. If // your network doesn't have an option like this and instead only ever returns // URLs for images (rather than the images themselves), your adapter should // download image assets on behalf of the publisher. This should be done after // receiving the native ad object from your network's SDK, and before calling // the connector's adapter:didReceiveMediatedNativeAd: method. sampleRequest.shouldDownloadImages = YES; sampleRequest.preferredImageOrientation = NativeAdImageOrientationAny; sampleRequest.shouldRequestMultipleImages = NO; sampleRequest.testMode = adConfiguration.isTestRequest; for (GADAdLoaderOptions *loaderOptions in adConfiguration.options) { if ([loaderOptions isKindOfClass:[GADNativeAdImageAdLoaderOptions class]]) { GADNativeAdImageAdLoaderOptions *imageOptions = (GADNativeAdImageAdLoaderOptions *)loaderOptions; 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 ([loaderOptions isKindOfClass:[GADNativeAdMediaAdLoaderOptions class]]) { GADNativeAdMediaAdLoaderOptions *mediaOptions = (GADNativeAdMediaAdLoaderOptions *)loaderOptions; switch (mediaOptions.mediaAspectRatio) { case GADMediaAspectRatioLandscape: sampleRequest.preferredImageOrientation = NativeAdImageOrientationLandscape; break; case GADMediaAspectRatioPortrait: sampleRequest.preferredImageOrientation = NativeAdImageOrientationPortrait; break; default: sampleRequest.preferredImageOrientation = NativeAdImageOrientationAny; break; } } else if ([loaderOptions isKindOfClass:[GADNativeAdViewAdOptions class]]) { _nativeAdViewAdOptions = (GADNativeAdViewAdOptions *)loaderOptions; } } // This custom event uses the server parameter to carry an ad unit ID, which // is the most common use case. NSString *adUnit = adConfiguration.credentials.settings[@"parameter"]; adLoader.adUnitID = adUnit; adLoader.delegate = self; [adLoader fetchAd:sampleRequest]; }
Si el anuncio se recupera correctamente o encuentra un error,
llamaría a GADMediationNativeAdLoadCompletionHandler
. En caso de éxito,
Pasa la clase que implementa GADMediationNativeAd
con un valor nil
.
para el parámetro de error; en caso de falla, pasa por el error que
que encuentran.
Por lo general, estos métodos se implementan dentro de devoluciones de llamada del SDK de terceros que implementa tu adaptador. Para este ejemplo, el SDK de muestra
tiene un SampleNativeAdDelegate
con devoluciones de llamada relevantes:
Swift
func adLoader( _ adLoader: SampleNativeAdLoader, didReceive nativeAd: SampleNativeAd ) { extraAssets = [ SampleCustomEventConstantsSwift.awesomenessKey: nativeAd.degreeOfAwesomeness ?? "" ] if let image = nativeAd.image { images = [GADNativeAdImage(image: image)] } else { let imageUrl = URL(fileURLWithPath: nativeAd.imageURL) images = [GADNativeAdImage(url: imageUrl, scale: nativeAd.imageScale)] } if let mappedIcon = nativeAd.icon { icon = GADNativeAdImage(image: mappedIcon) } else { let iconURL = URL(fileURLWithPath: nativeAd.iconURL) icon = GADNativeAdImage(url: iconURL, scale: nativeAd.iconScale) } adChoicesView = SampleAdInfoView() self.nativeAd = nativeAd if let handler = completionHandler { delegate = handler(self, nil) } } func adLoader( _ adLoader: SampleNativeAdLoader, 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)adLoader:(SampleNativeAdLoader *)adLoader didReceiveNativeAd:(SampleNativeAd *)nativeAd { if (nativeAd.image) { _images = @[ [[GADNativeAdImage alloc] initWithImage:nativeAd.image] ]; } else { NSURL *imageURL = [[NSURL alloc] initFileURLWithPath:nativeAd.imageURL]; _images = @[ [[GADNativeAdImage alloc] initWithURL:imageURL scale:nativeAd.imageScale] ]; } if (nativeAd.icon) { _icon = [[GADNativeAdImage alloc] initWithImage:nativeAd.icon]; } else { NSURL *iconURL = [[NSURL alloc] initFileURLWithPath:nativeAd.iconURL]; _icon = [[GADNativeAdImage alloc] initWithURL:iconURL scale:nativeAd.iconScale]; } // The sample SDK provides an AdChoices view (SampleAdInfoView). If your SDK // provides image and click through 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. _adChoicesView = [[SampleAdInfoView alloc] init]; _nativeAd = nativeAd; _adEventDelegate = _loadCompletionHandler(self, nil); } - (void)adLoader:(SampleNativeAdLoader *)adLoader 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); }
Cómo asignar anuncios nativos
Los diferentes SDK tienen sus propios formatos únicos para los anuncios nativos. Uno podría regresar objetos que contienen un "título" de red, por ejemplo, mientras que otro podría tener "título". Además, los métodos que se usan para hacer un seguimiento de las impresiones de clics varíen de un SDK a otro.
Para solucionar estos problemas, cuando un evento personalizado recibe un objeto de anuncio nativo de
su SDK mediado, debe usar una clase que implemente GADMediationNativeAd
como SampleCustomEventNativeAd
, a "map" el objeto de anuncio nativo del SDK mediado
para que coincida con la interfaz
que espera el SDK de anuncios de Google para dispositivos móviles.
Ahora analizaremos con más detalle los detalles de implementación de
SampleCustomEventNativeAd
Almacena tus asignaciones
Se espera que GADMediationNativeAd
implemente ciertas propiedades que son
asignado a partir de otras propiedades del SDK:
Swift
var nativeAd: SampleNativeAd? var headline: String? { return nativeAd?.headline } var images: [GADNativeAdImage]? var body: String? { return nativeAd?.body } var icon: GADNativeAdImage? var callToAction: String? { return nativeAd?.callToAction } var starRating: NSDecimalNumber? { return nativeAd?.starRating } var store: String? { return nativeAd?.store } var price: String? { return nativeAd?.price } var advertiser: String? { return nativeAd?.advertiser } var extraAssets: [String: Any]? { return [ SampleCustomEventConstantsSwift.awesomenessKey: nativeAd?.degreeOfAwesomeness ?? "" ] } var adChoicesView: UIView? var mediaView: UIView? { return nativeAd?.mediaView }
Objective-C
/// Used to store the ad's images. In order to implement the /// GADMediationNativeAd protocol, we use this class to return the images /// property. NSArray<GADNativeAdImage *> *_images; /// Used to store the ad's icon. In order to implement the GADMediationNativeAd /// protocol, we use this class to return the icon property. GADNativeAdImage *_icon; /// Used to store the ad's ad choices view. In order to implement the /// GADMediationNativeAd protocol, we use this class to return the adChoicesView /// property. UIView *_adChoicesView; - (nullable NSString *)headline { return _nativeAd.headline; } - (nullable NSArray<GADNativeAdImage *> *)images { return _images; } - (nullable NSString *)body { return _nativeAd.body; } - (nullable GADNativeAdImage *)icon { return _icon; } - (nullable NSString *)callToAction { return _nativeAd.callToAction; } - (nullable NSDecimalNumber *)starRating { return _nativeAd.starRating; } - (nullable NSString *)store { return _nativeAd.store; } - (nullable NSString *)price { return _nativeAd.price; } - (nullable NSString *)advertiser { return _nativeAd.advertiser; } - (nullable NSDictionary<NSString *, id> *)extraAssets { return @{SampleCustomEventExtraKeyAwesomeness : _nativeAd.degreeOfAwesomeness}; } - (nullable UIView *)adChoicesView { return _adChoicesView; } - (nullable UIView *)mediaView { return _nativeAd.mediaView; } - (BOOL)hasVideoContent { return self.mediaView != nil; }
Algunas redes mediadas pueden proporcionar activos adicionales aparte de los definidos por el
SDK de anuncios de Google para dispositivos móviles. El protocolo GADMediationNativeAd
incluye un método
llamada extraAssets
, que el SDK de anuncios de Google para dispositivos móviles usa para recuperar cualquiera de
estos "extra" los recursos de tu asignador.
Cómo asignar recursos de imagen
Asignar recursos de imagen es más complicado que asignar datos más sencillos
tipos como NSString
o double
. Es posible que las imágenes se descarguen automáticamente
se muestran como valores de URL. Su densidad de píxeles también puede variar.
Para ayudarte a administrar estos detalles, el SDK de anuncios de Google para dispositivos móviles proporciona la
Clase GADNativeAdImage
. Información de los recursos de imagen (si es UIImage
real)
objetos o solo valores NSURL
) deben devolverse al SDK de anuncios de Google para dispositivos móviles.
usando esta clase.
A continuación, se muestra cómo la clase de asignación crea un GADNativeAdImage
para contener el
imagen de ícono:
Swift
if let image = nativeAd.image { images = [GADNativeAdImage(image: image)] } else { let imageUrl = URL(fileURLWithPath: nativeAd.imageURL) images = [GADNativeAdImage(url: imageUrl, scale: nativeAd.imageScale)] }
Objective-C
if (nativeAd.image) { _images = @[ [[GADNativeAdImage alloc] initWithImage:nativeAd.image] ]; } else { NSURL *imageURL = [[NSURL alloc] initFileURLWithPath:nativeAd.imageURL]; _images = @[ [[GADNativeAdImage alloc] initWithURL:imageURL scale:nativeAd.imageScale] ]; }
Eventos de impresión y clic
Tanto el SDK de anuncios de Google para dispositivos móviles como el SDK mediado deben saber cuándo un se produce una impresión o un clic, pero solo un SDK debe hacer un seguimiento de estos eventos. Hay hay dos enfoques diferentes que los eventos personalizados pueden usar, dependiendo de si SDK mediado admite el seguimiento de impresiones y clics por su cuenta.
Cómo hacer un seguimiento de los clics y las impresiones con el SDK de anuncios de Google para dispositivos móviles
Si el SDK mediado no realiza su propio seguimiento de impresiones y clics, pero
proporciona métodos para registrar impresiones y clics, el SDK de anuncios de Google
hacer un seguimiento de estos eventos
y notificar al adaptador. El protocolo GADMediationNativeAd
incluye dos métodos: didRecordImpression:
y didRecordClickOnAssetWithName:view:viewController:
que los eventos personalizados pueden implementar para llamar al método correspondiente en el objeto de anuncio nativo mediado:
Swift
func didRecordImpression() { nativeAd?.recordImpression() } func didRecordClickOnAsset( withName assetName: GADUnifiedNativeAssetIdentifier, view: UIView, wController: UIViewController ) { nativeAd?.handleClick(on: view) }
Objective-C
- (void)didRecordImpression { if (self.nativeAd) { [self.nativeAd recordImpression]; } } - (void)didRecordClickOnAssetWithName:(GADUnifiedNativeAssetIdentifier)assetName view:(UIView *)view viewController:(UIViewController *)viewController { if (self.nativeAd) { [self.nativeAd handleClickOnView:view]; } }
Debido a que la clase que implementa GADMediationNativeAd
protocolo contiene una referencia al objeto de anuncio nativo del SDK de muestra, puede llamar al
método apropiado en ese objeto para informar un clic o una impresión. Ten en cuenta que
El método didRecordClickOnAssetWithName:view:viewController:
toma un solo
parámetro: el objeto View
que corresponde al recurso del anuncio nativo que recibió
el clic.
Haz un seguimiento de los clics y las impresiones con el SDK mediado
Es posible que algunos SDKs mediados prefieran hacer un seguimiento de los clics y las impresiones por su cuenta. En
En ese caso, debes implementar handlesUserClicks
y
handlesUserImpressions
, como se muestra en el siguiente fragmento. Devolución
YES
, indicas que el evento personalizado es responsable del seguimiento.
estos eventos, y notificará al SDK de anuncios de Google para dispositivos móviles cuando se produzcan.
Los eventos personalizados que anulen el seguimiento de clics e impresiones pueden utilizar el
Mensaje didRenderInView:
para pasar la vista del anuncio nativo a los SDK mediados
objeto de anuncio nativo para permitir que el SDK mediado realice el seguimiento real. La muestra
SDK de nuestro proyecto de evento personalizado de ejemplo (del cual se extraen los fragmentos de código de esta guía
no utiliza este enfoque' pero, si lo hace,
el código del evento personalizado
llamaría al método setNativeAdView:view:
, como se muestra en el siguiente fragmento:
Swift
func handlesUserClicks() -> Bool { return true } func handlesUserImpressions() -> Bool { return true } func didRender( in view: UIView, clickableAssetViews: [GADNativeAssetIdentifier: UIView], nonclickableAssetViews: [GADNativeAssetIdentifier: 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.nativeAd?.setNativeAdView(view) }
Objective-C
- (BOOL)handlesUserClicks { return YES; } - (BOOL)handlesUserImpressions { return YES; } - (void)didRenderInView:(UIView *)view clickableAssetViews:(NSDictionary<GADNativeAssetIdentifier, UIView *> *) clickableAssetViews nonclickableAssetViews:(NSDictionary<GADNativeAssetIdentifier, 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 [_nativeAd setNativeAdView:view]; }
Reenvía eventos de mediación al SDK de anuncios de Google para dispositivos móviles
Una vez que hayas llamado
GADMediationNativeLoadCompletionHandler
con un anuncio cargado, el delegado GADMediationNativeAdEventDelegate
devuelto
objeto puede usarse por el adaptador para reenviar eventos de presentación desde el
de terceros al SDK de anuncios de Google para dispositivos móviles.
Es importante que tu evento personalizado reenvíe tantas de estas devoluciones de llamada como sea posible, de modo que tu app reciba estos eventos equivalentes del SDK de Google Mobile Ads. Este es un ejemplo del uso de devoluciones de llamada:
Esto completa la implementación de eventos personalizados para los anuncios nativos. El ejemplo completo está disponible en GitHub: