App-Start-Anzeigen

Dieser Leitfaden richtet sich an Publisher, die App-Start-Anzeigen einbinden.

App-Start-Anzeigen sind ein spezielles Anzeigenformat für Publisher, die ihre App-Ladebildschirme monetarisieren möchten. Nutzer können App-Start-Anzeigen jederzeit schließen. App-Start-Anzeigen können eingeblendet werden, wenn Nutzer Ihre App in den Vordergrund holen.

Bei App-Start-Anzeigen ist automatisch das Branding Ihrer App zu sehen, damit die Nutzer wissen, dass sie sich in Ihrer App befinden. Hier ein Beispiel für eine App-Start-Anzeige:

Im Folgenden sind die Schritte auf hoher Ebene aufgeführt, die zum Implementieren von App-Start-Anzeigen erforderlich sind:

  1. Erstellen Sie eine Manager-Klasse, die eine Anzeige lädt, bevor Sie sie präsentieren müssen.
  2. Präsentieren Sie die Anzeige bei Ereignissen, bei denen die App in den Vordergrund geholt wird.
  3. Verarbeiten Sie Präsentations-Callbacks.

Vorbereitung

Immer mit Testanzeigen testen

Verwenden Sie beim Erstellen und Testen Ihrer Apps Testanzeigen anstelle von Live-Anzeigen. Andernfalls kann es zur Sperrung Ihres Kontos kommen.

Testanzeigen lassen sich am einfachsten mit unserer speziellen Test-Anzeigenblock-ID für App-Start-Anzeigen laden:

/21775744923/example/app-open

Sie ist speziell so konfiguriert, dass für jede Anfrage Testanzeigen zurückgegeben werden. Sie können sie beim Programmieren, Testen und Debuggen in Ihren eigenen Apps verwenden. Ersetzen Sie sie vor der Veröffentlichung Ihrer App durch Ihre eigene Anzeigenblock-ID.

Weitere Informationen zur Funktionsweise von Google Mobile Ads SDK Testanzeigen finden Sie unter Test Anzeigen.

Manager-Klasse implementieren

Ihre Anzeige sollte schnell eingeblendet werden. Daher ist es am besten, sie zu laden, bevor Sie sie präsentieren müssen. So ist eine Anzeige verfügbar, sobald der Nutzer Ihre App öffnet. Implementieren Sie eine Manager-Klasse, um Anzeigenanfragen zu stellen, bevor Sie die Anzeige präsentieren müssen.

Erstellen Sie eine neue Singleton-Klasse mit dem Namen 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;
}

Implementieren Sie das AppOpenAdManagerDelegate-Protokoll:

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

Anzeige laden

Der nächste Schritt besteht darin, eine App-Start-Anzeige zu laden:

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];
  }];
}

Anzeige präsentieren

Der nächste Schritt besteht darin, eine App-Start-Anzeige zu präsentieren. Wenn keine Anzeige verfügbar ist, versuchen Sie, eine neue zu laden.

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;
}

Anzeige bei Ereignissen präsentieren, bei denen die App in den Vordergrund geholt wird

Wenn die Anwendung aktiv wird, rufen Sie showAdIfAvailable() auf, um eine Anzeige zu präsentieren, falls eine verfügbar ist, oder um eine neue zu laden.

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];
}

Präsentations-Callbacks verarbeiten

Wenn Sie Benachrichtigungen zu Präsentationsereignissen erhalten möchten, müssen Sie GADFullScreenContentDelegate der Eigenschaft `fullScreenContentDelegate` der zurückgegebenen Anzeige zuweisen:

Swift

appOpenAd?.fullScreenContentDelegate = self

Objective-C

self.appOpenAd.fullScreenContentDelegate = self;

Insbesondere sollten Sie die nächste App-Start-Anzeige anfordern, sobald die Präsentation der ersten Anzeige beendet ist. Der folgende Code zeigt, wie Sie das Protokoll in Ihrer AppOpenAdManager-Datei implementieren:

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];
}

Ablauf von Anzeigen berücksichtigen

Damit keine abgelaufene Anzeige präsentiert wird, können Sie dem App-Delegate eine Methode hinzufügen, mit der die seit dem Laden der Anzeigenreferenz verstrichene Zeit geprüft wird.

Fügen Sie in AppOpenAdManager eine Date-Eigenschaft mit dem Namen loadTime hinzu und legen Sie die Eigenschaft fest, wenn Ihre Anzeige geladen wird. Anschließend können Sie eine Methode hinzufügen, die true zurückgibt, wenn seit dem Laden der Anzeige weniger als eine bestimmte Anzahl von Stunden vergangen ist. Prüfen Sie die Gültigkeit Ihrer Anzeigenreferenz, bevor Sie versuchen, die Anzeige zu präsentieren.

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];
}

Kaltstarts und Ladebildschirme

In der Dokumentation wird davon ausgegangen, dass Sie App-Start-Anzeigen nur präsentieren, wenn Nutzer Ihre App in den Vordergrund holen, während sie im Arbeitsspeicher angehalten wird. Von einem „Kaltstart“ spricht man, wenn Ihre App gestartet wird, aber zuvor nicht im Arbeitsspeicher angehalten wurde.

Ein Beispiel für einen Kaltstart ist, wenn ein Nutzer Ihre App zum ersten Mal öffnet. Bei Kaltstarts ist keine zuvor geladene App-Start-Anzeige verfügbar, die sofort präsentiert werden kann. Die Verzögerung zwischen dem Anfordern und dem Erhalt einer Anzeige kann dazu führen, dass Nutzer Ihre App kurz verwenden können, bevor sie von einer Anzeige überrascht werden, die nicht zum Kontext passt. Das sollte vermieden werden, da es zu einer schlechten Nutzererfahrung führt.

Die bevorzugte Methode für App-Start-Anzeigen bei Kaltstarts ist die Verwendung eines Ladebildschirms zum Laden der Assets Ihres Spiels oder Ihrer App. Die Anzeige sollte nur auf dem Ladebildschirm eingeblendet werden. Wenn Ihre App vollständig geladen wurde und der Nutzer zum Hauptinhalt Ihrer App weitergeleitet wurde, sollte die Anzeige nicht mehr präsentiert werden.

Best Practices

Google hat App-Start-Anzeigen entwickelt, damit Sie den Ladebildschirm Ihrer App monetarisieren können. Sie sollten jedoch Best Practices beachten, damit Ihre Nutzer Ihre App gerne verwenden. Achten Sie auf Folgendes:

  • Präsentieren Sie die erste App-Start-Anzeige erst, nachdem die Nutzer Ihre App einige Male verwendet haben.
  • Präsentieren Sie App-Start-Anzeigen in Zeiten, in denen Ihre Nutzer andernfalls warten würden, bis Ihre App geladen ist.
  • Wenn sich die App-Start-Anzeige auf einem Ladebildschirm befindet und der Ladevorgang abgeschlossen ist, bevor die Anzeige beendet wird, können Sie den Ladebildschirm mit der Methode adDidDismissFullScreenContent beenden.

Vollständiges Beispiel auf GitHub

Swift Objective-C

Nächste Schritte

Weitere Informationen zum Datenschutz für Nutzer.