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
- Google Mobile Ads SDK 7.53.0 oder höher
- Szenenunterstützung in Ihrem Projekt aktivieren
- Implementieren Sie mindestens ein Anzeigenformat.
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]; } }]; }
Banner
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.