Unterstützung mehrerer Fenster auf dem iPad

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

In diesem Leitfaden werden die Best Practices für das korrekte Rendern von Anzeigen im Mehrfenstermodus auf dem iPad erläutert.

Voraussetzungen

Szenen in einer Anzeigenanfrage festlegen

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

Swift

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

  GADInterstitialAd.load(withAdUnitID: "[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. Wenn die Anzeige jedoch nicht im Vollbildmodus präsentiert werden soll, schlägt die Präsentation fehl. 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 view DidAppear:

Beim Mehrfenstermodus ist es erforderlich, eine Fensterszene zum Senden von Anzeigenanfragen zu haben. Da einem Fenster in viewDidLoad: noch keine Ansicht hinzugefügt wurde, sollten Sie stattdessen Anzeigenanfragen in viewDidAppear: erstellen, wobei die Fensterszene zu diesem Zeitpunkt festgelegt ist.

Beachten Sie, dass viewDidAppear: während des Lebenszyklus einer Anwendung mehrmals aufgerufen werden kann. Wir empfehlen, den Initialisierungscode der Anzeigenanfrage in ein Flag zu verpacken, das anzeigt, ob dies bereits geschehen 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

Nutzer können Szenen jederzeit verschieben und die Fenstergröße nach einer Anzeigenanfrage ändern. Es liegt an Ihnen, eine neue Anzeige anzufordern, wenn die Größe angepasst wird. Im Beispielcode unten wird viewWillTransitionToSize:withTransitionCoordinator: verwendet, um eine Benachrichtigung zu erhalten, wenn das Fenster des Root-Ansicht-Controllers gedreht oder die Größe angepasst wird. Sie können aber auch windowScene:didUpdateCoordinateSpace:interfaceOrientation:traitCollection: auf fensterszenenspezifische Änderungen warten.

Interstitial-Anzeige und Anzeige mit Prämie

Das Google Mobile Ads SDK bietet die Methode canPresentFromViewController:error:, mit der ermittelt wird, ob eine Interstitial-Anzeige oder eine Anzeige mit Prämie gültig ist. So lässt sich 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(fromRootViewController: 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 die gleiche Weise ändern wie die Fensterdrehung. Ihre App muss sicherstellen, dass die Banneranzeige in die neue Fenstergröße passt.

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 = GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(bannerWidth)

  let request = GADRequest()
  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 kontrollieren das Rendering nativer Anzeigen und sind dafür verantwortlich, dass die native Anzeige in einer Ansicht mit angepasster Größe gerendert wird, ähnlich wie der Rest Ihres App-Contents.

Bekannte Probleme

Derzeit werden der Mehrfenstermodus und der Splitscreen-Modus nur im Hochformat unterstützt. Wenn Sie eine Anzeige im Querformat anfordern, erhalten Sie die folgende Protokollmeldung.

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