Formati di annunci nativi personalizzati

Formati degli annunci personalizzati

Come le loro controparti definite dal sistema, i formati degli annunci nativi personalizzati vengono caricati utilizzando gli oggetti GADAdLoader. Se includi la costante GADAdLoaderAdTypeCustomNative nell'array adTypes durante l'inizializzazione di un GADAdLoader, lo configurerai in modo che richieda formati nativi personalizzati al caricamento degli annunci.

GADCustomNativeAdLoaderDelegate

Il protocollo per il caricamento dei formati personalizzati prevede due metodi. Il primo viene utilizzato da GADAdLoader per scoprire quali ID formato deve richiedere:

Swift

public func customNativeAdFormatIDs(for adLoader: GADAdLoader) -> [Any]

Objective-C

- (NSArray *)customNativeAdFormatIDsForAdLoader:(GADAdLoader *)adLoader;

Ogni formato dell'annuncio nativo personalizzato ha un ID formato corrispondente che lo identifica. Quando viene chiamato questo metodo, l'app deve restituire un array contenente gli ID formato degli annunci che è pronta a mostrare.

Il secondo messaggio viene inviato al caricamento dell'annuncio nativo personalizzato, come per i formati definiti dal sistema:

Swift

public func adLoader(_ adLoader: GADAdLoader,
    didReceive customNativeAd: GADCustomNativeAd)

Objective-C

- (void)adLoader:(GADAdLoader *)adLoader
    didReceiveCustomNativeAd:(GADCustomNativeAd *)customNativeAd;

ID formato

Gli ID formato utilizzati per fare riferimento in modo univoco ai formati di annunci nativi personalizzati si trovano nell'interfaccia utente di Ad Manager nella sezione Nativo del menu a discesa Pubblicazione:

L'ID formato di ogni annuncio nativo personalizzato viene visualizzato accanto al nome. Se fai clic su uno dei nomi, viene visualizzata una schermata dei dettagli che mostra informazioni sui campi del formato:

Da qui, i singoli campi possono essere aggiunti, modificati e rimossi. Prendi nota del nome di ogni risorsa. Il nome è la chiave utilizzata per recuperare i dati di ogni asset quando viene visualizzato il formato dell'annuncio nativo personalizzato.

Visualizzazione di formati degli annunci nativi personalizzati

I formati degli annunci nativi personalizzati sono diversi da quelli definiti dal sistema in quanto i publisher hanno la possibilità di definire il proprio elenco di asset che compongono un annuncio. Per questo motivo, la procedura per la visualizzazione degli annunci nativi personalizzati è diversa da quella per i formati definiti dal sistema in alcuni aspetti:

  1. Poiché GADCustomNativeAd è progettato per gestire qualsiasi formato di annunci nativi personalizzati che crei, non ha accessori delle risorse denominati. ma offre metodi come imageForKey: e stringForKey: che prendono il nome del campo come argomento.
  2. Non esiste una classe di visualizzazione annunci dedicata come GADNativeAdView da utilizzare con GADCustomNativeAd. Puoi utilizzare la visualizzazione più adatta alla tua esperienza utente.
  3. Poiché non esiste un'apposita classe di visualizzazione dell'annuncio, non devi registrare nessuna delle visualizzazioni utilizzate per mostrare gli asset dell'annuncio.

Ecco un esempio di visualizzazione annuncio in grado di mostrare un semplice annuncio nativo personalizzato:

MySimpleNativeAdView.h

Swift

import UIKit
import GoogleMobileAds

/// Custom native ad view class with format ID 10063170.
class MySimpleNativeAdView: UIView {

  /// Weak references to this ad's asset views.
  @IBOutlet weak var headlineView: UILabel!
  @IBOutlet weak var mainImageView: UIImageView!
  @IBOutlet weak var captionView: UILabel!

  ...

  /// Populates the ad view with the custom native ad object.
  func populateWithCustomNativeAd(_ customNativeAd: GADCustomNativeAd) {
    ...
  }
}

Objective-C

@import UIKit;
@import GoogleMobileAds;

/// View representing a custom native ad format with format ID 10063170.
@interface MySimpleNativeAdView : UIView

// Weak references to this ad's asset views.
@property(weak, nonatomic) IBOutlet UILabel *headlineView;
@property(weak, nonatomic) IBOutlet UIImageView *mainImageView;
@property(weak, nonatomic) IBOutlet UILabel *captionView;

/// Populates the ad view with the custom native ad object.
- (void)populateWithCustomNativeAd:(GADCustomNativeAd *)customNativeAd;

@end

MySimpleNativeAdView.m (estratto)

Swift

...
func populateWithCustomNativeAd(_ customNativeAd: GADCustomNativeAd) {
  self.customNativeAd = customNativeAd

  // Populate the custom native ad assets.
  headlineView.text = self.customNativeAd.stringForKey("Headline")
  mainImageView.image = self.customNativeAd.imageForKey("MainImage")?.image
  captionView.text = self.customNativeAd.stringForKey("Caption")
}
...

Objective-C

...
- (void)populateWithCustomNativeAd:(GADCustomNativeAd *)customNativeAd {
  self.customNativeAd = customNativeAd;

  // Populate the custom native ad assets.
  self.headlineView.text = [customNativeAd stringForKey:@"Headline"];
  self.mainImageView.image = [customNativeAd imageForKey:@"MainImage"].image;
  self.captionView.text = [customNativeAd stringForKey:@"Caption"];
}
...

Rendering dell'icona Scegli Tu!

Nell'ambito del supporto del Digital Services Act (DSA), gli annunci basati su prenotazione pubblicati nello Spazio economico europeo (SEE) richiedono un' icona Scegli Tu! e un link alla pagina Su questo annuncio di Google. Quando implementi annunci nativi personalizzati, sei responsabile del rendering dell'icona Scegli Tu!. È importante che tu esegua le operazioni per eseguire il rendering e impostare il click listener per l'icona Scegli Tu! durante il rendering degli asset annuncio principali.

L'esempio seguente mostra l'icona Scegli Tu! e configura il comportamento appropriato per i clic.

Swift

class MySimpleNativeAdView: UIView {
  @IBOutlet weak var adChoicesView: UIImageView!

  override func awakeFromNib() {
    super.awakeFromNib()

    // Enable clicks on AdChoices.
    adChoicesView.addGestureRecognizer(
      UITapGestureRecognizer(
        target: self,
        action: #selector(performClickOnAdChoices(_:))))
    adChoicesView.isUserInteractionEnabled = true
  }

  @objc func performClickOnAdChoices(_ sender: UIImage!) {
    customNativeAd.performClickOnAsset(withKey:
      GADNativeAssetIdentifier.adChoicesViewAsset.rawValue)
  }

  func populate(withCustomNativeAd customNativeAd: GADCustomNativeAd) {

    // Render the AdChoices image.
    let adChoicesKey = GADNativeAssetIdentifier.adChoicesViewAsset.rawValue
    let adChoicesImage = customNativeAd.image(forKey: adChoicesKey)?.image
    adChoicesView.image = adChoicesImage
    adChoicesView.isHidden = adChoicesImage == nil
    ...
  }
}

Objective-C

@interface MySimpleNativeAdView ()

@property(nonatomic, weak) IBOutlet UIImageView *adChoicesView;

@end

@implementation MySimpleNativeAdView

- (void)awakeFromNib {
  [super awakeFromNib];
  // Enable clicks on AdChoices.
  [self.adChoicesView addGestureRecognizer:[[UITapGestureRecognizer alloc]
                                            initWithTarget:self
                                            action:@selector(performClickOnAdChoices:)]];
  self.adChoicesView.userInteractionEnabled = YES;
}

- (void)performClickOnAdChoices:(UITapGestureRecognizer *)sender {
    [self.customNativeAd performClickOnAssetWithKey:GADNativeAdChoicesViewAsset];
}

- (void)populateWithCustomNativeAd:(GADCustomNativeAd *)customNativeAd {
  // Render the AdChoices image.
  GADNativeAdImage *adChoicesAsset = [customNativeAd
    imageForKey:GADNativeAdChoicesViewAsset];
  self.adChoicesView.image = adChoicesAsset.image;
  self.adChoicesView.hidden = (adChoicesAsset == nil);
  ...
}

Video nativo per i formati degli annunci nativi personalizzati

Quando crei un formato personalizzato, hai la possibilità di renderlo idoneo per i video.

Nell'implementazione dell'app, puoi utilizzare la proprietà GADCustomNativeAd.mediaView per ottenere la visualizzazione del video. Aggiungi questa visualizzazione alla gerarchia delle visualizzazioni. Se l'annuncio non include contenuti video, crea piani alternativi per mostrarlo senza video.

L'esempio seguente verifica se l'annuncio include contenuti video e mostra un'immagine al suo posto se non è disponibile un video:

Swift

...
  /// Populates the ad view with the custom native ad object.
  func populate(withCustomNativeAd customNativeAd: GADCustomNativeAd) {
    if customNativeAd.videoController.hasVideoContent(),
      let mediaView = customNativeAd.mediaView {
      updateMainView(mediaView)
    } else {
      // Assumes your native format has an image asset with the name MainImage.
      let image: UIImage? = customNativeAd.image(forKey: "MainImage")?.image
      updateMainView(UIImageView(image: image))
    }
  }

  private func updateMainView(_ mainView:UIView) {
    // Assumes you have a placeholder view for your media content.
    // Remove all the placeholder's subviews.
    for subview: UIView in mainPlaceholder.subviews {
      subview.removeFromSuperview()
    }
    mainPlaceholder.addSubview(mainView)
    // Size the media view to fill our container size.
    mainView.translatesAutoresizingMaskIntoConstraints = false
    let viewDictionary: [AnyHashable: Any] = ["mainView":mainView]
    mainPlaceholder.addConstraints(NSLayoutConstraint.constraints(
      withVisualFormat: "H:|[mainView]|", options: [], metrics: nil,
      views: viewDictionary as? [String : Any] ?? [String : Any]()))
    mainPlaceholder.addConstraints(NSLayoutConstraint.constraints(
      withVisualFormat: "V:|[mainView]|", options: [], metrics: nil,
      views: viewDictionary as? [String : Any] ?? [String : Any]()))
  }
...

Objective-C

...
- (void)populateWithCustomNativeAd:(GADCustomNativeAd *)ad {
  UIView *mainView = nil;
  if (ad.videoController.hasVideoContent) {
    mainView = ad.mediaView;
  } else {
    // Assumes your native format has an image asset with the name MainImage.
    UIImage *image = [ad imageForKey:@"MainImage"].image;
    mainView = [[UIImageView alloc] initWithImage:image];
  }
  // Assumes you have a placeholder view for your media content.
  for (UIView *subview in self.mainPlaceholder.subviews) {
    [subview removeFromSuperview];
  }
  [self.mainPlaceholder addSubview:mainView];

  // Size the main view to fill our container size.
  [mainView setTranslatesAutoresizingMaskIntoConstraints:NO];
  NSDictionary *viewDictionary = NSDictionaryOfVariableBindings(mainView);
  [self.mainPlaceholder
      addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[mainView]|"
                                                             options:0
                                                             metrics:nil
                                                               views:viewDictionary]];
}
...

Consulta GADVideoController per saperne di più su come personalizzare l'esperienza video di un annuncio nativo personalizzato.

Scarica l'esempio di rendering personalizzato di Ad Manager per un esempio pratico di video nativo in azione.

Gestione dei clic e delle impressioni degli annunci nativi personalizzati

Per i formati degli annunci nativi personalizzati, è responsabilità dell'app registrare le impressioni e segnalare gli eventi di clic all'SDK.

Registrazione delle impressioni

Per registrare un'impressione per un annuncio nativo personalizzato, basta chiamare il metodo recordImpression su GADCustomNativeAd corrispondente:

Swift

myCustomNativeAd.recordImpression()

Objective-C

[myCustomNativeAd recordImpression];

L'SDK impedisce la registrazione di impressioni duplicate per una singola richiesta, se la tua app chiama accidentalmente il metodo più volte per lo stesso annuncio.

Report sui clic

Per segnalare all'SDK che si è verificato un clic su una visualizzazione della risorsa, chiama il metodo performClickOnAssetWithKey: sul corrispondente GADCustomNativeAd e passa il nome della risorsa su cui è stato fatto clic. Ad esempio, se nel tuo formato personalizzato hai un asset denominato "MainImage" e vuoi registrare un clic sulla visualizzazione corrispondente a quell'asset, il tuo codice sarà simile al seguente:

Swift

myCustomNativeAd.performClickOnAsset(withKey: "MainImage")

Objective-C

[myCustomNativeAd performClickOnAssetWithKey:@"MainImage"];

Tieni presente che non è necessario chiamare questo metodo per ogni visualizzazione dell'asset associata al tuo annuncio. Ad esempio, se avessi un altro asset denominato "Caption" che doveva essere visualizzato, ma su cui l'utente non poteva fare clic o toccare, la tua app non avrebbe bisogno di chiamare performClickOnAssetWithKey: per quella visualizzazione.

Rispondere alle azioni personalizzate dei clic

GADCustomNativeAd ha una proprietà customClickHandler di tipo GADNativeAdCustomClickHandler

Swift

typealias GADNativeAdCustomClickHandler = (assetID: String) -> Void

Objective-C

typedef void (^GADNativeAdCustomClickHandler)(NSString *assetID);

Si tratta di un blocco (Objective-C) / una chiusura (Swift) che accetta un assetID come parametro di input, che identifica la risorsa su cui è stato fatto clic.

Quando viene eseguito un clic su un annuncio nativo personalizzato, l'SDK può fornire tre possibili risposte, tentate in questo ordine:

  1. Richiama il blocco customClickHandler in Objective-C o la chiusura in Swift, se impostato.
  2. Esegui un ciclo sugli URL dei link diretti dell'annuncio e apri il primo per cui è possibile trovare un'app corrispondente.
  3. Apri un browser e vai all'URL di destinazione tradizionale dell'annuncio.

La proprietà customClickHandler accetta un blocco in Objective-C e una chiusura in Swift. Se imposti un blocco o una chiusura, l'SDK lo eseguirà e non intraprenderà alcun ulteriore azione. Tuttavia, se imposti un valore nullo, l'SDK utilizzerà come alternativa i link diretti e/o gli URL di destinazione registrati con l'annuncio.

I gestori dei clic personalizzati consentono alla tua app di decidere autonomamente l'azione migliore da intraprendere in risposta a un clic, che si tratti di aggiornare l'interfaccia utente, presentare un altro visualizzatore o semplicemente registrare il clic. Ecco un esempio che mostra un avviso:

Swift

myCustomNativeAd.customClickHandler = { assetID in
  if assetID == "MainImage" {
    let alertView = UIAlertView(title: "Custom Click",
        message: "You just clicked on the image!",
        delegate: self,
        cancelButtonTitle: "OK")
    alertView.alertViewStyle = .default
    alertView.show()
  }
}
myCustomNativeAd.performClickOnAsset(withKey: "MainImage")

Objective-C

[self.customNativeAd setCustomClickHandler:^(NSString *assetID){
  if ([assetID isEqualToString:@"MainImage"]) {
    [[[UIAlertView alloc] initWithTitle:@"Custom Click"
                                message:@"You just clicked on the image!"
                               delegate:self
                      cancelButtonTitle:@"OK"
                      otherButtonTitles:nil] show];
  }
}];
[self.customNativeAd performClickOnAssetWithKey:@"MainImage"];

Testare il codice degli annunci nativi

Annunci venduti direttamente

Se vuoi provare gli annunci nativi venduti direttamente, puoi utilizzare questo ID unità pubblicitaria Ad Manager:

/21775744923/example/native

È configurato per pubblicare annunci di contenuti e per l'installazione di app di esempio, nonché un formato di annuncio nativo personalizzato con i seguenti asset:

  • Titolo (testo)
  • MainImage (immagine)
  • Caption (testo)

Annunci di backfill nativi

Per testare il comportamento degli annunci di backfill nativi, utilizza questa unità pubblicitaria Ad Manager:

/21775744923/example/native-backfill

Verranno pubblicati annunci di contenuti e per l'installazione di app di esempio che includono l'overlay Scegli Tu!.

Ricordati di aggiornare il codice in modo che faccia riferimento agli ID unità pubblicitarie e ai formati effettivi prima di pubblicare gli annunci.