Sviluppo dell'adattatore di mediazione della rete pubblicitaria

Questa guida è rivolta alle reti pubblicitarie che vogliono creare un adattatore di mediazione. Se sei un publisher, consulta le istruzioni per la mediazione per i publisher.

Un adattatore di mediazione è il livello di comunicazione tra la rete pubblicitaria e la mediazione Google Mobile Ads. Gli adattatori pubblicano gli annunci dalla rete pubblicitaria inoltrando al contempo gli eventi annuncio pertinenti ad AdMob. Un adattatore è responsabile dell'implementazione del protocollo GADMAdNetworkAdapter per garantire che fornisca le funzionalità richieste.

Prerequisiti

  • Xcode 15.3 o successivo
  • Target di deployment 8.0 o versioni successive
  • Intestazioni aggiuntive dalla cartella Adattatori di mediazione del download dell'SDK Google Mobile Ads per iOS

Per poter creare un adattatore di mediazione, la rete pubblicitaria deve avere un rapporto di lavoro stabilito con Google.

Rete pubblicitaria di esempio

Questa guida illustra come creare un adattatore per la rete pubblicitaria di esempio. L'SDK Sample Ad Network contiene classi rappresentative delle classi offerte dalla maggior parte delle reti pubblicitarie:

@interface SampleBanner : UILabel

@property(nonatomic, copy) NSString *adUnit;
@property(nonatomic, weak) id<SampleBannerAdDelegate> delegate;
- (void)fetchAd:(SampleAdRequest *)request;

@end

typedef NS_ENUM(NSInteger, SampleErrorCode) {
  SampleErrorCodeBadRequest = 0,
  SampleErrorCodeUnknown = 1,
  SampleErrorCodeNetworkError = 2,
  SampleErrorCodeNoInventory = 3,
};

@interface SampleAdRequest : NSObject

@property(nonatomic, assign) BOOL testMode;
@property(nonatomic, copy) NSArray *keywords;

@end

@interface SampleInterstitial : NSObject

@property(nonatomic, copy) NSString *adUnit;
@property(nonatomic, weak) id<SampleInterstitialAdDelegate> delegate;
@property(nonatomic, assign, getter=isInterstitialLoaded) BOOL interstitialLoaded;
- (void)fetchAd:(SampleAdRequest *)request;
- (void)show;

@end

@protocol SampleBannerAdDelegate
- (void)bannerDidLoad:(SampleBanner *)banner;
- (void)banner:(SampleBanner *)banner didFailToLoadAdWithError:(SampleErrorCode)error;
- (void)bannerWillLeaveApplication:(SampleBanner *)banner;

@end

@protocol SampleInterstitialAdDelegate<NSObject>
- (void)interstitialDidLoad:(SampleInterstitial *)interstitial;
- (void)interstitial:(SampleInterstitial *)interstitial
    didFailToLoadAdWithError:(SampleErrorCode)error;
- (void)interstitialWillPresentScreen:(SampleInterstitial *)interstitial;
- (void)interstitialWillDismissScreen:(SampleInterstitial *)interstitial;
- (void)interstitialDidDismissScreen:(SampleInterstitial *)interstitial;
- (void)interstitialWillLeaveApplication:(SampleInterstitial *)interstitial;

@end

Consulta l'implementazione completa dell'SDK di esempio per ulteriori informazioni su queste classi.

Connettore

Gli adattatori di mediazione interagiscono con l'SDK Google Mobile Ads utilizzando un oggetto che implementa il protocollo GADMAdNetworkConnector. D'ora in poi, chiameremo questo oggetto connettore. Il connettore espone le informazioni necessarie per le richieste di annuncio e fornisce un mezzo per richiamare la mediazione per gli eventi annuncio e le interazioni degli utenti. Il connettore viene fornito agli adattatori di mediazione al momento dell'inizializzazione. Configura l'adattatore per archiviare il connettore in una variabile di istanza:

- (id)initWithGADMAdNetworkConnector:(id<GADMAdNetworkConnector>)c {
  if ((self = [super init])) {
    _connector = c;
  }
  return self;
}

Parametri del server

È probabile che la tua rete pubblicitaria abbia bisogno di identificatori per identificare un publisher. La rete pubblicitaria di esempio, ad esempio, richiede un'unità pubblicitaria. Questi parametri server obbligatori vengono forniti all'adattatore tramite il metodo credentials, che restituisce uno NSDictionary degli identificatori e dei valori corrispondenti. La seguente riga di codice recupera il parametro del server denominato ad_unit per la rete pubblicitaria di esempio dal connettore:

self.interstitialAd.adUnit = [[self.connector credentials] objectForKey:@"ad_unit"];

Configurazione della rete di mediazione

Le reti pubblicitarie devono informare AdMob dei parametri server richiesti per la loro rete. In questo modo AdMob può configurare la tua rete in frontend.

Quando attivi la mediazione per la rete nel front-end, AdMob ti chiede di inserire i valori necessari per creare un'istanza dell'adattatore. Il seguente screenshot mostra che è necessario un APID (Application Placement Identifier) per Millennial Media e un ID app per InMobi.

Consulta questo articolo per ulteriori informazioni sulla configurazione delle reti pubblicitarie di mediazione.

Effettuare una richiesta di annuncio di mediazione

Per le richieste di banner di mediazione, il metodo getBannerWithSize viene chiamato immediatamente dopo aver creato un'istanza dell'adattatore. Questo metodo non restituisce niente. Indica all'adattatore di avviare un recupero dell'annuncio asincrono sulla rete. Fai in modo che l'adattatore ascolti i callback dell'SDK. Se il tuo SDK non supporta la dimensione dell'annuncio specificata o non supporta gli annunci banner, richiama il metodo adapter:didFailAd: sul connettore.

Un'implementazione di getBannerWithSize per la rete pubblicitaria di esempio ha il seguente aspetto:

- (void)getBannerWithSize:(GADAdSize)adSize {
  //The adapter should fail immediately if the adSize is not supported
  if (!GADAdSizeEqualToSize(adSize, GADAdSizeBanner) &&
      !GADAdSizeEqualToSize(adSize, GADAdSizeMediumRectangle) &&
      !GADAdSizeEqualToSize(adSize, GADAdSizeFullBanner) &&
      !GADAdSizeEqualToSize(adSize, GADAdSizeLeaderboard)) {
    NSString *errorDesc =
        [NSString stringWithFormat:@"Invalid ad type %@, not going to get ad.",
                                   NSStringFromGADAdSize(adSize)];
    NSDictionary *errorInfo = [NSDictionary
        dictionaryWithObjectsAndKeys:errorDesc, NSLocalizedDescriptionKey, nil];
    NSError *error = [NSError errorWithDomain:GADErrorDomain
                                         code:GADErrorMediationInvalidAdSize
                                     userInfo:errorInfo];
    [self.connector adapter:self didFailAd:error];
    return;
  }
  self.bannerAd = [[SampleBanner alloc]
      initWithFrame:CGRectMake(0, 0, adSize.size.width, adSize.size.height)];

  self.bannerAd.delegate = self;
  self.bannerAd.adUnit = [[self.connector credentials] objectForKey:@"ad_unit"];

  // Setup request parameters.
  SampleAdRequest *request = [[SampleAdRequest alloc] init];
  request.testMode = self.connector.testMode;
  request.keywords = self.connector.userKeywords;
  [self.bannerAd fetchAd:request];
  NSLog(@"Requesting banner from Sample Ad Network");
}

Parametri di targeting aggiuntivi

Il connettore contiene alcune informazioni di targeting comuni a cui puoi fare riferimento per il targeting degli annunci:

  • userKeywords
  • testMode
  • childDirectedTreatment

Extra mediazione

Le opzioni extra di mediazione consentono alla rete pubblicitaria di supportare input o parametri di targeting aggiuntivi non coperti dai parametri di richiesta aggiuntivi forniti dal connettore. Questa funzionalità può essere fornita tramite una classe che implementa il protocollo GADAdNetworkExtras. La classe SampleAdNetworkExtras è mostrata di seguito come esempio:

@interface SampleAdNetworkExtras : NSObject <GADAdNetworkExtras>
/// Should ad volume audio be muted.
@property(nonatomic, assign) BOOL muteAudio;

@end

I publisher devono passare un'istanza della sottoclasse GADAdNetworkExtras quando effettuano una richiesta di annuncio. È possibile accedere a questa istanza della sottoclasse GADAdNetworkExtras tramite il connettore. Ecco come puoi utilizzare le opzioni extra di mediazione quando crei una richiesta di annuncio per la tua rete:

SampleAdRequest *request = [[SampleAdRequest alloc] init];
SampleAdNetworkExtras *myAdNetworkExtras = [self.connector networkExtras];
request.muteAudio = myAdNetworkExtras.muteAudio;
[self.bannerAd fetchAd:request];

Per assicurarti che la sottoclasse GADAdNetworkExtras sia accessibile tramite il connettore, implementa networkExtrasClass e restituisci la tua sottoclasse GADAdNetworkExtras:

+ (Class<GADAdNetworkExtras>)networkExtrasClass {
  return [SampleAdNetworkExtras class];
}

Se l'adattatore non utilizza le opzioni extra di mediazione, il metodo networkExtrasClass restituisce Nil.

Invia notifica mediazione

Fai in modo che l'adattatore implementi il listener di annunci per la tua rete e inoltri i callback pertinenti degli eventi annuncio tramite il connettore. La tabella seguente spiega quando chiamare ciascun metodo delegato:

Metodo Quando chiamare
adapter:didReceiveAdView: Richiesta banner riuscita.
adapter:didFailAd: La richiesta del banner non è andata a buon fine.
adapterDidGetAdClick: È stato fatto clic sul banner.
adapterWillPresentFullScreenModal: Il banner presenterà un overlay in-app.
adapterWillDismissFullScreenModal: L'overlay in-app verrà chiuso.
adapterDidDismissFullScreenModal: L'overlay in-app è stato chiuso.
adapterWillLeaveApplication: L'applicazione verrà posizionata in background o chiusa perché l'utente ha fatto clic su un annuncio che avvia un'altra applicazione.

L'esempio seguente implementa l'interfaccia SampleBannerAdDelegate dalla rete pubblicitaria di esempio per inoltrare messaggi di errore e di stato:

- (void)bannerDidLoad:(SampleBanner *)banner {
  [self.connector adapter:self didReceiveAdView:banner];
}

- (void)banner:(SampleBanner *)banner didFailWithError:(SampleErrorCode)error {
  [self.connector adapter:self
                didFailAd:[NSError errorWithDomain:@"Ad request failed"
                                              code:error
                                          userInfo:nil]];
}

- (void)bannerWillLeaveApplication:(SampleBanner *)banner {
  [self.connector adapterDidGetAdClick:self];
  [self.connector adapterWillLeaveApplication:self];
}

Lancia l'overlay in-app e l'applicazione esterna

Quando un utente fa clic su un banner, l'annuncio potrebbe aprire un overlay a schermo intero o un'applicazione esterna (come Safari o l'app store). I callback del connettore da richiamare in questi due casi sono diversi.

Se un clic sul banner apre un overlay a schermo intero, chiama adapterWillPresentFullScreenModal: quando presenti l'overlay. Quando l'overlay è chiuso, chiama sia adapterWillDismissFullScreenModal: sia adapterDidDismissFullScreenModal:.

Se un clic sul banner (o un clic sull'overlay a schermo intero) spinge l'utente a uscire dall'applicazione, richiama il callback adapterWillLeaveApplication:.

Ora disponi di un adattatore di mediazione funzionante per i banner. Come riferimento, un'implementazione completa di SampleAdapter è disponibile su GitHub.

Implementare un adattatore interstitial

L'implementazione dell'adattatore per gli annunci interstitial è simile agli annunci banner. Il metodo getInterstitial viene chiamato subito dopo la verifica dell'adattatore. Questo metodo non restituisce nulla. L'adattatore dovrebbe avviare un recupero dell'annuncio asincrono sulla rete. Fai in modo che l'adattatore agisca da delega all'SDK per ascoltare i callback. Se il tuo SDK non supporta gli annunci interstitial, richiama il metodo adapter:didFailAd: del connettore come segue:

- (void)getInterstitial {
  self.interstitialAd = [[SampleInterstitial alloc] init];
  self.interstitialAd.delegate = self;
  self.interstitialAd.adUnit =
      [[self.connector credentials] objectForKey:@"ad_unit"];

  SampleAdRequest *request = [[SampleAdRequest alloc] init];
  // Setup request parameters.
  request.testMode = self.connector.testMode;
  request.keywords = self.connector.userKeywords;

  [self.interstitialAd fetchAd:request];
  NSLog(@"Requesting interstitial from Sample Ad Network");
}

Come con MediationBannerAdapter, puoi ricevere l'identificazione del publisher e le informazioni di targeting degli annunci dal connettore.

Invia notifica mediazione

Fai in modo che l'adattatore implementi il delegato annuncio per la rete e inoltri i callback pertinenti dell'evento annuncio tramite il connettore. La tabella seguente spiega quando chiamare ciascun metodo delegato:

Metodo Quando chiamare
adapterDidReceiveInterstitial: Richiesta di interstitial riuscita.
adapter:didFailInterstitial: Richiesta di interstitial non riuscita.
adapterDidGetAdClick: È stato fatto clic sull'interstitial.
adapterWillPresentInterstitial: Verrà mostrato l'interstitial.
adapterWillDismissInterstitial: L'interstitial verrà ignorato.
adapterDidDismissInterstitial: La pagina interstitial è stata ignorata.
adapterWillLeaveApplication: L'applicazione verrà riprodotta in background o chiusa perché l'utente ha fatto clic su un annuncio che avvia un'altra applicazione.

Nell'esempio seguente viene implementata l'interfaccia SampleInterstitialAdDelegate della rete pubblicitaria di esempio per inoltrare messaggi di errore e di stato:

- (void)interstitialDidLoad:(SampleInterstitial *)interstitial {
  [self.connector adapterDidReceiveInterstitial:self];
}

- (void)interstitial:(SampleInterstitial *)interstitial
    didFailWithError:(SampleErrorCode)error {
  [self.connector adapter:self
      didFailInterstitial:[NSError errorWithDomain:@"Ad request failed"
                                              code:error
                                          userInfo:nil]];
}

- (void)interstitialWillPresentScreen:(SampleInterstitial *)interstitial {
  [self.connector adapterWillPresentInterstitial:self];
}

- (void)interstitialWillDismissScreen:(SampleInterstitial *)interstitial {
  [self.connector adapterWillDismissInterstitial:self];
}

- (void)interstitialDidDismissScreen:(SampleInterstitial *)interstitial {
  [self.connector adapterDidDismissInterstitial:self];
}

Presentare una creatività interstitial

Dopo che l'adattatore chiama adapterDidReceiveInterstitial, attendi che mostri l'interstitial fino alla chiamata di presentInterstitialFromRootViewController. Lo sviluppatore di app decide quando mostrare l'interstitial, anche dopo diversi minuti.

Di seguito è riportata un'implementazione di presentInterstitialFromRootViewController: per la rete pubblicitaria di esempio:

- (void)presentInterstitialFromRootViewController:
    (UIViewController *)rootViewController {
  if ([self.interstitialAd isLoaded]) {
    [self.interstitialAd show];
  }
}

L'adattatore di mediazione è pronto per gestire gli annunci interstitial. Come riferimento, un'implementazione completa di SampleAdapter è disponibile su GitHub.

Domande frequenti

Devo includere l'adattatore come parte della mia libreria SDK o come libreria separata?
Ti consigliamo di includere l'adattatore nella libreria dell'SDK, in modo che gli sviluppatori debbano fare riferimento a una sola libreria per incorporare la rete.
Che cosa devo fare se il mio adattatore supporta solo annunci banner?

Se l'adattatore supporta solo i banner, fai in modo che inoltri un evento di errore alla mediazione per le richieste di interstitial:

- (void)getInterstitial {
  NSDictionary *errorInfo = @{ NSLocalizedDescriptionKey : @"Some error" };
  NSError *error = [NSError errorWithDomain:GADErrorDomain
                                       code:GADErrorInvalidRequest
                                   userInfo:errorInfo];
  [self.connector adapter:self didFailInterstitial:error];
  return;
}
Che cosa devo fare se il mio adattatore supporta solo annunci interstitial?

Se l'adattatore supporta solo interstitial, fai in modo che inoltri un evento di errore alla mediazione per le richieste di banner:

- (void)getBannerWithSize:(GADAdSize)adSize {
  NSDictionary *errorInfo = @{ NSLocalizedDescriptionKey : @"Some error" };
  NSError *error =
      [NSError errorWithDomain:GADErrorDomain
                          code:GADErrorInvalidRequest
                      userInfo:errorInfo];
  [self.connector adapter:self didFailAd:error];
  return;
}