Annunci apertura app

Questa guida è destinata ai publisher che integrano gli annunci apertura app.

Gli annunci apertura app sono un formato di annuncio speciale destinato ai publisher che vogliono monetizzare le schermate di caricamento delle loro app. Gli utenti possono chiudere gli annunci apertura app in qualsiasi momento. Gli annunci apertura app possono essere mostrati quando gli utenti portano la tua app in primo piano.

Gli annunci apertura app mostrano automaticamente una piccola area di branding, in modo che gli utenti sappiano di essere all'interno della tua app. Ecco un esempio di come appare un annuncio apertura app:

In linea generale, ecco i passaggi necessari per implementare gli annunci apertura app:

  1. Crea una classe di gestione che carichi un annuncio prima di doverlo mostrare.
  2. Mostra l'annuncio durante gli eventi di primo piano dell'app.
  3. Gestisci i callback di presentazione.

Prerequisiti

Esegui sempre test con annunci di prova

Quando crei e testi le tue app, assicurati di utilizzare annunci di prova anziché annunci di produzione. In caso contrario, il tuo account potrebbe essere sospeso.

Il modo più semplice per caricare gli annunci di prova è utilizzare l'ID unità pubblicitaria di prova dedicato per gli annunci apertura app:

/21775744923/example/app-open

È stato configurato appositamente per restituire annunci di prova per ogni richiesta e puoi utilizzarlo liberamente nelle tue app durante la codifica, i test e il debug. Assicurati di sostituirlo con il tuo ID unità pubblicitaria prima di pubblicare l'app.

Per ulteriori informazioni sul funzionamento degli annunci di prova Google Mobile Ads SDK, consulta la pagina Test Ads.

Implementa una classe di gestione

L'annuncio deve essere visualizzato rapidamente, quindi è consigliabile caricarlo prima di doverlo mostrare. In questo modo, avrai un annuncio pronto non appena l'utente entra nella tua app. Implementa una classe di gestione per effettuare richieste di annunci prima di doverli mostrare.

Crea una nuova classe singleton denominata AppOpenAdManager:

Swift

class AppOpenAdManager: NSObject {
  /// The app open ad.
  var appOpenAd: AppOpenAd?
  /// Maintains a reference to the delegate.
  weak var appOpenAdManagerDelegate: AppOpenAdManagerDelegate?
  /// Keeps track of if an app open ad is loading.
  var isLoadingAd = false
  /// Keeps track of if an app open ad is showing.
  var isShowingAd = false
  /// Keeps track of the time when an app open ad was loaded to discard expired ad.
  var loadTime: Date?
  /// For more interval details, see https://support.google.com/admanager/answer/9351867
  let timeoutInterval: TimeInterval = 4 * 3_600

  static let shared = AppOpenAdManager()

Objective-C

@interface AppOpenAdManager ()

/// The app open ad.
@property(nonatomic, strong, nullable) GADAppOpenAd *appOpenAd;
/// Keeps track of if an app open ad is loading.
@property(nonatomic, assign) BOOL isLoadingAd;
/// Keeps track of if an app open ad is showing.
@property(nonatomic, assign) BOOL isShowingAd;
/// Keeps track of the time when an app open ad was loaded to discard expired ad.
@property(nonatomic, strong, nullable) NSDate *loadTime;

@end

/// For more interval details, see https://support.google.com/admanager/answer/9351867
static const NSInteger kTimeoutInterval = 4;

@implementation AppOpenAdManager

+ (nonnull AppOpenAdManager *)sharedInstance {
  static AppOpenAdManager *instance = nil;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    instance = [[AppOpenAdManager alloc] init];
  });
  return instance;
}

E implementa il relativo protocollo AppOpenAdManagerDelegate:

Swift

protocol AppOpenAdManagerDelegate: AnyObject {
  /// Method to be invoked when an app open ad life cycle is complete (i.e. dismissed or fails to
  /// show).
  func appOpenAdManagerAdDidComplete(_ appOpenAdManager: AppOpenAdManager)
}

Objective-C

@protocol AppOpenAdManagerDelegate <NSObject>
/// Method to be invoked when an app open ad life cycle is complete (i.e. dismissed or fails to
/// show).
- (void)adDidComplete;
@end

Carica un annuncio

Il passaggio successivo consiste nel caricare un annuncio apertura app:

Swift

func loadAd() async {
  // Do not load ad if there is an unused ad or one is already loading.
  if isLoadingAd || isAdAvailable() {
    return
  }
  isLoadingAd = true

  do {
    appOpenAd = try await AppOpenAd.load(
      with: "/21775744923/example/app-open", request: AdManagerRequest())
    appOpenAd?.fullScreenContentDelegate = self
    loadTime = Date()
  } catch {
    print("App open ad failed to load with error: \(error.localizedDescription)")
    appOpenAd = nil
    loadTime = nil
  }
  isLoadingAd = false
}

Objective-C

- (void)loadAd {
  // Do not load ad if there is an unused ad or one is already loading.
  if ([self isAdAvailable] || self.isLoadingAd) {
    return;
  }
  self.isLoadingAd = YES;

  [GADAppOpenAd loadWithAdUnitID:@"/21775744923/example/app-open"
                         request:[GADRequest request]
               completionHandler:^(GADAppOpenAd * _Nullable appOpenAd, NSError * _Nullable error) {
    self.isLoadingAd = NO;
    if (error) {
      NSLog(@"App open ad failed to load with error: %@", error);
      self.appOpenAd = nil;
      self.loadTime = nil;
      return;
    }
    self.appOpenAd = appOpenAd;
    self.appOpenAd.fullScreenContentDelegate = self;
    self.loadTime = [NSDate date];
  }];
}

Mostra un annuncio

Il passaggio successivo consiste nel mostrare un annuncio apertura app. Se non è disponibile alcun annuncio, prova a caricarne uno nuovo.

Swift

func showAdIfAvailable() {
  // If the app open ad is already showing, do not show the ad again.
  if isShowingAd {
    return print("App open ad is already showing.")
  }

  // If the app open ad is not available yet but is supposed to show, load
  // a new ad.
  if !isAdAvailable() {
    print("App open ad is not ready yet.")
    // The app open ad is considered to be complete in this example.
    appOpenAdManagerDelegate?.appOpenAdManagerAdDidComplete(self)
    // Load a new ad.
    return
  }

  if let appOpenAd {
    print("App open ad will be displayed.")
    appOpenAd.present(from: nil)
    isShowingAd = true
  }
}

Objective-C

- (void)showAdIfAvailable {
  // If the app open ad is already showing, do not show the ad again.
  if (self.isShowingAd) {
    NSLog(@"App open ad is already showing.");
    return;
  }

  // If the app open ad is not available yet but is supposed to show, load
  // a new ad.
  if (![self isAdAvailable]) {
    NSLog(@"App open ad is not ready yet.");
    // The app open ad is considered to be complete in this example.
    [self adDidComplete];
    // Load a new ad.
    return;
  }

  [self.appOpenAd presentFromRootViewController:nil];
  self.isShowingAd = YES;
}

Mostra l'annuncio durante gli eventi di primo piano dell'app

Quando l'applicazione diventa attiva, chiama showAdIfAvailable() per mostrare un annuncio, se disponibile, o caricarne uno nuovo.

Swift

func applicationDidBecomeActive(_ application: UIApplication) {
  // Show the app open ad when the app is foregrounded.
  AppOpenAdManager.shared.showAdIfAvailable()
}

Objective-C

- (void) applicationDidBecomeActive:(UIApplication *)application {
  // Show the app open ad when the app is foregrounded.
  [AppOpenAdManager.sharedInstance showAdIfAvailable];
}

Gestisci i callback di presentazione

Per ricevere notifiche per gli eventi di presentazione, devi assegnare GADFullScreenContentDelegate alla proprietà `fullScreenContentDelegate` dell'annuncio restituito:

Swift

appOpenAd?.fullScreenContentDelegate = self

Objective-C

self.appOpenAd.fullScreenContentDelegate = self;

In particolare, ti consigliamo di richiedere il successivo annuncio apertura app una volta terminata la presentazione del primo. Il seguente codice mostra come implementare il protocollo nel file AppOpenAdManager:

Swift

func adDidRecordImpression(_ ad: FullScreenPresentingAd) {
  print("App open ad recorded an impression.")
}

func adDidRecordClick(_ ad: FullScreenPresentingAd) {
  print("App open ad recorded a click.")
}

func adWillDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("App open ad will be dismissed.")
}

func adWillPresentFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("App open ad will be presented.")
}

func adDidDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("App open ad was dismissed.")
  appOpenAd = nil
  isShowingAd = false
  appOpenAdManagerDelegate?.appOpenAdManagerAdDidComplete(self)
  Task {
    await loadAd()
  }
}

func ad(
  _ ad: FullScreenPresentingAd,
  didFailToPresentFullScreenContentWithError error: Error
) {
  print("App open ad failed to present with error: \(error.localizedDescription)")
  appOpenAd = nil
  isShowingAd = false
  appOpenAdManagerDelegate?.appOpenAdManagerAdDidComplete(self)
  Task {
    await loadAd()
  }
}

Objective-C

- (void)adDidRecordImpression:(nonnull id<GADFullScreenPresentingAd>)ad {
  NSLog(@"App open ad recorded an impression.");
}

- (void)adDidRecordClick:(nonnull id<GADFullScreenPresentingAd>)ad {
  NSLog(@"App open ad recorded a click.");
}

- (void)adWillPresentFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
  NSLog(@"App open ad will be presented.");
}

- (void)adWillDismissFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
  NSLog(@"App open ad will be dismissed.");
}

- (void)adDidDismissFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
  NSLog(@"App open ad was dismissed.");
  self.appOpenAd = nil;
  self.isShowingAd = NO;
  [self adDidComplete];
  [self loadAd];
}

- (void)ad:(nonnull id<GADFullScreenPresentingAd>)ad
    didFailToPresentFullScreenContentWithError:(nonnull NSError *)error {
  NSLog(@"App open ad failed to present with error: %@", error.localizedDescription);
  self.appOpenAd = nil;
  self.isShowingAd = NO;
  [self adDidComplete];
  [self loadAd];
}

Tieni conto della scadenza dell'annuncio

Per assicurarti di non mostrare un annuncio scaduto, puoi aggiungere un metodo al delegato dell'app che controlla il tempo trascorso dal caricamento del riferimento dell'annuncio.

In AppOpenAdManager, aggiungi una proprietà Date denominata loadTime e impostala quando l'annuncio viene caricato. Poi puoi aggiungere un metodo che restituisce true se sono trascorse meno di un determinato numero di ore dal caricamento dell'annuncio. Assicurati di controllare la validità del riferimento dell'annuncio prima di provare a mostrarlo.

Swift

private func wasLoadTimeLessThanNHoursAgo(timeoutInterval: TimeInterval) -> Bool {
  // Check if ad was loaded more than n hours ago.
  if let loadTime = loadTime {
    return Date().timeIntervalSince(loadTime) < timeoutInterval
  }
  return false
}

private func isAdAvailable() -> Bool {
  // Check if ad exists and can be shown.
  return appOpenAd != nil && wasLoadTimeLessThanNHoursAgo(timeoutInterval: timeoutInterval)
}

Objective-C

- (BOOL)wasLoadTimeLessThanNHoursAgo:(int)n {
  // Check if ad was loaded more than n hours ago.
  NSDate *now = [NSDate date];
  NSTimeInterval timeIntervalBetweenNowAndLoadTime = [now timeIntervalSinceDate:self.loadTime];
  double secondsPerHour = 3600.0;
  double intervalInHours = timeIntervalBetweenNowAndLoadTime / secondsPerHour;
  return intervalInHours < n;
}

- (BOOL)isAdAvailable {
  // Check if ad exists and can be shown.
  return self.appOpenAd && [self wasLoadTimeLessThanNHoursAgo:kTimeoutInterval];
}

Avvii completi e schermate di caricamento

La documentazione presuppone che tu mostri gli annunci apertura app solo quando gli utenti portano la tua app in primo piano quando è sospesa in memoria. Gli "avvii completi" si verificano quando l'app viene avviata, ma non era stata sospesa in precedenza in memoria.

Un esempio di avvio a freddo è quando un utente apre la tua app per la prima volta. Con gli avvii completi, non avrai un annuncio apertura app caricato in precedenza e pronto per essere mostrato immediatamente. Il ritardo tra il momento in cui richiedi un annuncio e quello in cui lo ricevi può creare una situazione in cui gli utenti possono utilizzare brevemente la tua app prima di essere sorpresi da un annuncio fuori contesto. Questa situazione deve essere evitata perché comporta una pessima esperienza utente.

Il modo preferito per utilizzare gli annunci apertura app negli avvii completi è utilizzare una schermata di caricamento per caricare le risorse del gioco o dell'app e mostrare l'annuncio solo dalla schermata di caricamento. Se l'app ha completato il caricamento e ha inviato l'utente ai contenuti principali dell'app, non mostrare l'annuncio.

Best practice

Google ha creato gli annunci apertura app per aiutarti a monetizzare la schermata di caricamento della tua app, ma è importante tenere a mente le best practice in modo che gli utenti si divertano a utilizzare la tua app. Assicurati di:

  • Attendere prima di mostrare il primo annuncio apertura app finché gli utenti non hanno utilizzato l'app alcune volte.
  • Mostrare gli annunci apertura app durante i periodi in cui gli utenti altrimenti dovrebbero attendere il caricamento dell'app.
  • Se hai una schermata di caricamento sotto l'annuncio apertura app e il caricamento della schermata di caricamento viene completato prima che l'annuncio venga ignorato, potresti voler ignorare la schermata di caricamento nel metodo adDidDismissFullScreenContent.

Esempio completo su GitHub

Swift Objective-C

Passaggi successivi

Scopri di più sulla privacy degli utenti.