Unterstützung mehrerer Fenster auf dem iPad

Ab iOS 13 können Apps mehrere Fenster auf dem iPad unterstützen. Nutzer können also mit mehreren gleichzeitigen Kopien der Benutzeroberfläche einer App interagieren. Jedes Fenster kann in verschiedenen Größen erstellt und jederzeit angepasst werden. Das hat Auswirkungen darauf, wie Anzeigen geladen und präsentiert werden.

In diesem Leitfaden erfahren Sie, wie Sie Anzeigen in einem iPad-Szenario mit mehreren Fenstern richtig rendern.

Vorbereitung

Szene in einer Anzeigenanfrage festlegen

Damit Sie eine Anzeige erhalten, die in ein bestimmtes Fenster passt, übergeben Sie die windowScene der Ansicht an die Anzeigenanfrage. Das Google Mobile Ads SDK gibt eine Anzeige mit einer gültigen Größe für diese Szene zurück.

Swift

func loadInterstitial() {
  let request = Request()
  request.scene = view.window?.windowScene

  InterstitialAd.load(with: "[AD_UNIT_ID]",
      request: request) { ad, error in }
}

Objective-C

- (void)loadInterstitial {
  GADRequest *request = [GADRequest request];
  request.scene = self.view.window.windowScene;

  [GADInterstitialAd loadWithAdUnitID:@"[AD_UNIT_ID]"
      request:request
      completionHandler:^(GADInterstitialAd *ad, NSError *error) {}];
}

Im Testmodus schlagen Anzeigenanfragen mit dem folgenden Fehler fehl, wenn in Ihrer App mit mehreren Szenen eine Anzeige angefordert wird, ohne dass eine Szene übergeben wird:

<Google> Invalid Request. The GADRequest scene property should be set for
applications that support multi-scene. Treating the unset property as an error
while in test mode.

Im Produktionsmodus wird die Anzeigenanfrage ausgeführt, aber die Anzeige kann nicht präsentiert werden, wenn sie in einem Fenster angezeigt werden soll, das nicht den Vollbildmodus verwendet. Die Fehlermeldung lautet in diesem Fall:

<Google> Ad cannot be presented. The full screen ad content size exceeds the current window size.

Erstellen Sie die Anzeigenanfrage in viewDidAppear:

Im Fall von mehreren Fenstern ist eine Fensterszene zum Senden von Anzeigenanfragen erforderlich. Da einem Fenster in viewDidLoad: noch keine Ansicht hinzugefügt wurde, sollten Sie Anzeigenanfragen stattdessen in viewDidAppear: erstellen, wo die Fensterszene zu diesem Zeitpunkt festgelegt ist.

viewDidAppear: kann während des Lebenszyklus einer App mehrmals aufgerufen werden. Wir empfehlen, den Initialisierungscode für die Anzeigenanfrage in ein Flag einzuschließen, das angibt, ob die Initialisierung bereits erfolgt ist.

Swift

override func viewDidAppear(_ animated: Bool) {
  super.viewDidAppear(animated)
  if !requestInitialized {
    loadInterstitial()
    requestInitialized = true
  }
}

Objective-C

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  if (!_requestInitialized) {
    [self loadInterstitial];
    _requestInitialized = YES;
  }
}

Größenanpassung von Ziehpunkten

Nutzer können Szenen jederzeit verschieben und Fenstergrößen ändern, nachdem eine Anzeigenanfrage gesendet wurde. Sie müssen eine neue Anzeige anfordern, wenn die Größe geändert wird. Im Beispielcode unten wird viewWillTransitionToSize:withTransitionCoordinator: verwendet, um benachrichtigt zu werden, wenn sich das Fenster des Root-Ansichtscontrollers dreht oder die Größe ändert. Sie können aber auch windowScene:didUpdateCoordinateSpace:interfaceOrientation:traitCollection: verwenden, um auf Änderungen zu reagieren, die sich auf die Fensterszene beziehen.

Interstitial- und Anzeige mit Prämie

Das Google Mobile Ads SDK bietet die Methode canPresentFromViewController:error:, mit der Sie feststellen können, ob ein Interstitial oder eine Anzeige mit Prämie gültig ist. So können Sie prüfen, ob eine Vollbildanzeige aktualisiert werden muss, wenn sich die Fenstergröße ändert.

Swift

override func viewWillTransition(to size: CGSize,
    with coordinator: UIViewControllerTransitionCoordinator) {
  super.viewWillTransition(to: size, with: coordinator)

  coordinator.animate(alongsideTransition: nil) { [self] context in
    do {
      try interstitial?.canPresent(from: self)
    } catch {
      loadInterstitial()
    }
  }
}

Objective-C

- (void)viewWillTransitionToSize:(CGSize)size
    withTransitionCoordinator:(id)coordinator {
  [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

  [coordinator animateAlongsideTransition:nil
      completion:^(id _Nonnull context) {
    if (![self.interstitial canPresentFromRootViewController:self error:nil]) {
      [self loadInterstitial];
    }
  }];
}

Die Größenanpassung von Fenstern funktioniert genauso wie die Fensterrotation. Ihre App ist dafür verantwortlich, dass die Banneranzeige an die neue Fenstergröße angepasst wird.

Im folgenden Beispiel wird ein neues adaptives Banner mit der neuen Fensterbreite erstellt:

Swift

override func viewWillTransition(to size: CGSize,
    with coordinator: UIViewControllerTransitionCoordinator) {
  super.viewWillTransition(to: size, with: coordinator)

  coordinator.animate(alongsideTransition: nil) { [self] context in
    loadBanner()
  }
}

func loadBanner() {
  let bannerWidth = view.frame.size.width

  bannerView.adSize = currentOrientationAnchoredAdaptiveBanner(width: bannerWidth)

  let request = Request()
  request.scene = view.window?.windowScene
  bannerView.load(request)
}

Objective-C

- (void)viewWillTransitionToSize:(CGSize)size
    withTransitionCoordinator:(id)coordinator {
  [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

  [coordinator animateAlongsideTransition:nil
      completion:^(id _Nonnull context) {
    [self loadBannerAd];
  }];
}

- (void)loadBannerAd {
  CGFloat bannerWidth = self.view.frame.size.width;

  self.bannerView.adSize = GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(bannerWidth);

  GADRequest *request = [GADRequest request];
  request.scene = self.view.window.windowScene;
  [self.bannerView loadRequest:request];
}

Native Anzeige

Sie sind für das Rendern nativer Anzeigen verantwortlich und müssen dafür sorgen, dass die native Anzeige in einem Darstellungsbereich mit angepasster Größe gerendert wird, ähnlich wie die übrigen Inhalte Ihrer App.

Bekannte Probleme

Derzeit werden Anzeigen im Multi-Window- und Split-Screen-Modus nur im Hochformat unterstützt. Wenn Sie eine Anzeige im Querformat anfordern, erhalten Sie die folgende Log-Meldung.

<Google> Ad cannot be presented. The full screen ad content size exceeds the
current window size.