A partire da iOS 13, le applicazioni possono supportare più finestre su iPad, il che significa che gli utenti possono interagire con più copie simultanee dell'UI di un'app. Ogni finestra può essere creata in diverse dimensioni e ridimensionata in qualsiasi momento, il che influisce sulle modalità di caricamento e presentazione degli annunci.
Questa guida ha lo scopo di illustrarti le best practice per eseguire correttamente il rendering degli annunci in uno scenario multi-finestra per iPad.
Prerequisiti
- SDK Google Mobile Ads 7.53.0 o versioni successive
- Abilita il supporto delle scene nel progetto
- Implementa almeno un formato dell'annuncio.
Definisci lo scenario in una richiesta di annuncio
Per ricevere un annuncio che si adatta a una finestra specifica, passi il valore windowScene
della visualizzazione alla richiesta di annuncio. L'SDK Google Mobile Ads restituisce un annuncio
con dimensioni valide per la scena.
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) {}]; }
In modalità di test, le richieste di annunci avranno esito negativo con il seguente errore se l'app multiscena richiede un annuncio senza superare una scena:
<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.
In modalità di produzione la richiesta di annuncio va a buon fine, ma la presentazione dell'annuncio non andrà a buon fine se l'annuncio deve essere presentato in una finestra non a schermo intero. In questo caso, il messaggio di errore è:
<Google> Ad cannot be presented. The full screen ad content size exceeds the current window size.
Crea la richiesta di annuncio in viewDidAppear:
Il caso della modalità multi-finestra introduce il requisito di avere una scena finestra per inviare richieste di annunci. Poiché una vista non è ancora stata aggiunta a una finestra in
viewDidLoad:
, devi creare richieste di annunci in viewDidAppear:
dove la scena della finestra è impostata da quel punto.
Tieni presente che viewDidAppear:
può essere chiamato più volte durante il ciclo di vita di un'app. Ti consigliamo di includere il codice di inizializzazione della richiesta di annuncio in un flag che indichi se l'operazione è già stata eseguita.
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; } }
Gestisci il ridimensionamento
Gli utenti possono trascinare le scene in qualsiasi momento, modificando le dimensioni delle finestre dopo che è stata effettuata una richiesta di annuncio. Spetta a te richiedere un nuovo annuncio quando viene eseguito il ridimensionamento.
Il codice di esempio riportato di seguito utilizza viewWillTransitionToSize:withTransitionCoordinator:
per ricevere una notifica quando la finestra del controller di visualizzazione principale ruota o ridimensiona, ma puoi anche ascoltare windowScene:didUpdateCoordinateSpace:interfaceOrientation:traitCollection:
per modifiche specifiche alle scene della finestra.
Annuncio interstitial e con premio
L'SDK Google Mobile Ads fornisce il metodo canPresentFromViewController:error:
per determinare se un annuncio interstitial o con premio è valido o meno, offrendoti la possibilità di verificare se un annuncio a schermo intero deve essere aggiornato ogni volta che le dimensioni della finestra cambiano.
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
Puoi gestire il ridimensionamento delle finestre come per la rotazione delle finestre. La tua app deve garantire che l'annuncio banner si adatti alle nuove dimensioni della finestra.
L'esempio riportato di seguito crea un nuovo banner adattivo con la nuova larghezza della finestra:
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]; }
Annuncio nativo
Sei tu a controllare il rendering degli annunci nativi e devi assicurarti che l'annuncio nativo venga visualizzato in una visualizzazione ridimensionata, come per il resto dei contenuti dell'app.
Problemi noti
Al momento gli annunci multi-finestra e schermo diviso sono supportati solo in modalità verticale. Quando richiedi un annuncio in modalità Orizzontale, viene visualizzato il seguente messaggio di log.
<Google> Ad cannot be presented. The full screen ad content size exceeds the
current window size.