Formati di annunci nativi personalizzati

Formati di annunci personalizzati

Come le controparti definite dal sistema, i formati di annunci nativi personalizzati vengono caricati utilizzando oggetti GADAdLoader. Se includi la costante GADAdLoaderAdTypeCustomNative nell'array adTypes durante l'inizializzazione di una GADAdLoader, questa viene configurata per richiedere formati nativi personalizzati durante il caricamento degli annunci.

GADCustomNativeAdLoaderDelegate

Il protocollo per caricare i formati personalizzati ha 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 di annuncio nativo personalizzato ha un ID formato corrispondente che lo identifica. Quando viene richiamato questo metodo, la tua app deve restituire un array contenente gli ID dei formati degli annunci per la pubblicazione.

Il secondo messaggio viene inviato una volta caricato l'annuncio nativo personalizzato, in modo simile a quanto accade 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 a formati di annunci nativi personalizzati sono disponibili nell' Ad Manager interfaccia utente nella sezione Nativi all'interno del menu a discesa Pubblicazione:

L'ID formato di ogni annuncio nativo personalizzato viene visualizzato accanto al relativo nome. Facendo clic su uno dei nomi, vieni indirizzato a una schermata di dettagli con informazioni sui campi del formato:

Da qui è possibile aggiungere, modificare e rimuovere singoli campi. Prendi nota del nome di ogni risorsa. Il nome è la chiave utilizzata per ottenere i dati relativi a ogni asset quando mostri il formato di annuncio nativo personalizzato.

Visualizzazione di formati di annunci nativi personalizzati

I formati di annunci nativi personalizzati sono diversi da quelli definiti dal sistema perché i publisher hanno la possibilità di definire il proprio elenco di asset che compongono un annuncio. Per questo motivo, il processo di visualizzazione degli annunci nativi personalizzati varia da quello per i formati definiti dal sistema per alcuni aspetti:

  1. Poiché GADCustomNativeAd è pensato per gestire qualsiasi formato di annuncio nativo personalizzato che hai creato, non ha funzioni di accesso denominate degli asset. Offre invece metodi come imageForKey: e stringForKey: che prendono il nome del campo come argomento.
  2. Non esiste una classe di visualizzazione degli annunci dedicata come GADNativeAdView da utilizzare con GADCustomNativeAd. Puoi usare qualsiasi visualizzazione utile per la tua esperienza utente.
  3. Poiché non esiste una classe di visualizzazione annuncio dedicata, non devi registrare nessuna delle visualizzazioni che utilizzi per mostrare gli asset dell'annuncio.

Di seguito è riportato un esempio di visualizzazione di 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

My Simple NativeAdView.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"];
}
...

Video nativo per formati di annunci nativi personalizzati

Quando crei un formato personalizzato, puoi renderlo idoneo per i video.

Nell'implementazione dell'app, puoi utilizzare la proprietà GADCustomNativeAd.mediaView per ottenere la visualizzazione del video. e poi aggiungi questa visualizzazione alla gerarchia. Se l'annuncio non include contenuti video, fai piani alternativi per mostrare l'annuncio senza video.

L'esempio riportato di seguito consente di verificare se l'annuncio include contenuti video e di visualizzare un'immagine al suo posto se il video non è disponibile:

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]];
  [self.mainPlaceholder
      addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[mainView]|"
                                                             options:0
                                                             metrics:nil
                                                               views:viewDictionary]];
}
...

Consulta GADVideoController per ulteriori informazioni su come personalizzare l'esperienza video di un annuncio nativo personalizzato.

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

Gestione di impressioni e clic sugli annunci nativi personalizzati

Per i formati di annunci nativi personalizzati, l'app deve registrare le impressioni e generare report sugli eventi di clic all'SDK.

Registrazione delle impressioni

Per registrare un'impressione per un annuncio nativo personalizzato, è sufficiente chiamare il metodo recordImpression sul corrispondente GADCustomNativeAd:

Swift

myCustomNativeAd.recordImpression()

Objective-C

[myCustomNativeAd recordImpression];

L'SDK impedisce la registrazione di impressioni duplicate per una singola richiesta, nel caso in cui la tua app chiami accidentalmente il metodo più volte per lo stesso annuncio.

Report sui clic

Per segnalare all'SDK che si è verificato un clic su una visualizzazione di asset, richiama il metodo performClickOnAssetWithKey: sul metodo GADCustomNativeAd corrispondente e trasmetti il nome dell'asset su cui è stato fatto clic. Ad esempio, se avessi un asset nel tuo formato personalizzato denominato "MainImage" e volessi registrare un clic sulla vista corrispondente a quell'asset, il codice avrebbe il seguente aspetto:

Swift

myCustomNativeAd.performClickOnAsset(withKey: "MainImage")

Objective-C

[myCustomNativeAd performClickOnAssetWithKey:@"MainImage"];

Tieni presente che non è necessario chiamare questo metodo per ogni visualizzazione degli asset associata all'annuncio. Se ad esempio avessi un'altra risorsa denominata "Caption", che doveva essere visualizzata, ma non selezionata o toccata dall'utente, la tua app non avrebbe bisogno di chiamare performClickOnAssetWithKey: per quella visualizzazione.

Rispondere ad azioni di clic personalizzate

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) / chiusura (Swift) che accetta assetID come parametro di input, che identifica l'asset su cui è stato fatto clic.

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

  1. Richiama il blocco customClickHandler in Objective-C o la chiusura in Swift, se ne era stata impostata una.
  2. Scorri gli 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 esegue e non esegue ulteriori azioni. Se imposti un valore null, tuttavia, l'SDK utilizzerà il link diretto e/o gli URL di destinazione registrati con l'annuncio.

I gestori di 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 controller di visualizzazione 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"];

Test del codice dell'annuncio nativo

Annunci venduti direttamente

Per verificare come sono gli annunci nativi venduti direttamente, puoi utilizzare il seguente Ad Manager ID unità pubblicitaria:

/6499/example/native

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

  • Titolo (testo)
  • Immagine principale (immagine)
  • Didascalia (testo)

Annunci nativi di backfill

Per verificare il comportamento degli annunci di backfill nativi, utilizza questaAd Manager unità pubblicitaria:

/6499/example/native-backfill

Pubblicherà esempi di annunci per l'installazione di app e annunci di contenuti che includono l'overlay Scegli Tu!.

Ricorda di aggiornare il codice in modo da fare riferimento agli ID effettivi delle unità pubblicitarie e dei formati prima di pubblicare la campagna.