Unterstützung mehrerer Fenster auf dem iPad

Ab iOS 13 können Apps auf dem iPad mehrere Fenster 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 neu skaliert werden. Das hat Auswirkungen darauf, wie Anzeigen geladen und präsentiert werden.

In diesem Leitfaden finden Sie Best Practices für das korrekte Rendern von Anzeigen in einem iPad-Multifenster-Szenario.

Vorbereitung

Szene in einer Anzeigenanfrage festlegen

Damit eine Anzeige für ein bestimmtes Fenster ausgeliefert wird, ü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 = 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, die Anzeige wird jedoch nicht präsentiert, wenn sie nicht im Vollbildmodus angezeigt werden soll. In diesem Fall wird folgende Fehlermeldung angezeigt:

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

Erstellen Sie die Anzeigenanfrage in viewDidAppear:

Bei der Multifenster-Funktion ist für das Senden von Anzeigenanfragen eine Fensterszene erforderlich. Da einem Fenster in viewDidLoad: noch keine Ansicht hinzugefügt wurde, sollten Sie stattdessen Anzeigenanfragen in viewDidAppear: erstellen, wo die Fensterszene zu diesem Zeitpunkt festgelegt ist.

Hinweis: viewDidAppear: kann während des Lebenszyklus einer App mehrmals aufgerufen werden. Wir empfehlen, den Initialisierungscode der Anzeigenanfrage in ein Flag einzubetten, 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öße anpassen

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

Interstitial- und Anzeigen mit Prämie

Das Google Mobile Ads SDK bietet die MethodecanPresentFromViewController: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(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];
    }
  }];
}

Die Größe des Fensters lässt sich genauso ändern wie die Ausrichtung. Ihre App muss dafür sorgen, dass die Banneranzeige zur neuen 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 sind für das Rendern nativer Anzeigen verantwortlich und müssen dafür sorgen, dass die native Anzeige in einer angepassten Ansicht gerendert wird, ähnlich wie der Rest Ihrer App-Inhalte.

Bekannte Probleme

Derzeit werden Anzeigen im Mehrfenster- und Splitscreen-Format nur im Hochformat unterstützt. Wenn Sie eine Anzeige im Querformat anfordern, wird die folgende Protokollmeldung angezeigt.

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