Unterstützung für mehrere Fenster auf dem iPad

Ab iOS 13 können Anwendungen mehrere Fenster auf dem iPad unterstützen. Das bedeutet, dass Nutzer mit mehreren gleichzeitigen Kopien der Benutzeroberfläche einer App interagieren können. Jedes Fenster kann in verschiedenen Größen erstellt und jederzeit in der Größe 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 korrekt rendern.

Vorbereitung

Szene in einer Anzeigenanfrage festlegen

Wenn Sie eine Anzeige erhalten möchten, die zu einem bestimmten Fenster passt, übergeben Sie windowScene der Ansicht an die Anzeigenanfrage. Google Mobile Ads SDK gibt eine Anzeige mit gültiger 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 Ihre App mit mehreren Szenen eine Anzeige anfordert, ohne eine Szene zu übergeben:

<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 Präsentation der Anzeige schlägt fehl, wenn sie in einem Fenster präsentiert werden soll, das nicht im Vollbildmodus angezeigt wird. Die Fehlermeldung in diesem Fall lautet:

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

Anzeigenanfrage in „viewDidAppear“ erstellen:

Im Mehrfenstermodus muss eine Fensterszene vorhanden sein, um Anzeigenanfragen zu senden. Da in viewDidLoad: noch keine Ansicht zu einem Fenster hinzugefügt wurde, sollten Sie Anzeigenanfragen stattdessen in viewDidAppear: erstellen, wo die Fensterszene bereits festgelegt ist.

Beachten Sie, dass viewDidAppear: während des Lebenszyklus einer App mehrmals aufgerufen werden kann. Wir empfehlen, den Initialisierungscode für die Anzeigenanfrage in ein Flag einzuschließen, das angibt, ob er bereits ausgeführt wurde.

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ößenänderung verarbeiten

Nutzer können Szenen jederzeit verschieben und die Fenstergrößen ändern, nachdem eine Anzeigenanfrage gestellt 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-View-Controllers dreht oder die Größe ändert. Sie können aber auch auf windowScene:didUpdateCoordinateSpace:interfaceOrientation:traitCollection: hören, um benachrichtigt zu werden, wenn sich die Fensterszene ändert.

Interstitial- und Anzeigen mit Prämie

Google Mobile Ads SDK bietet die Methode canPresentFromViewController:error:, um zu ermitteln, ob eine Interstitial-Anzeige 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];
    }
  }];
}

Sie können die Fenstergröße auf dieselbe Weise ändern wie die Fensterdrehung. Ihre App muss dafür sorgen, 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 steuern das Rendering von nativen Anzeigen und sind dafür verantwortlich, dass die native Anzeige in einer Ansicht mit angepasster Größe gerendert wird, ähnlich wie der Rest des App-Inhalts.

Bekannte Probleme

Derzeit werden Anzeigen im Mehrfenstermodus und im Splitscreen-Modus nur im Hochformat unterstützt. Wenn Sie eine Anzeige im Querformat anfordern, wird der folgende Logeintrag angezeigt.

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