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