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'interfaccia utente di un'app. Ogni finestra può essere creata in dimensioni diverse e può essere ridimensionata in qualsiasi momento, il che ha implicazioni sul modo in cui gli annunci vengono caricati e presentati.
Questa guida ha lo scopo di mostrarti le best practice per il rendering corretto degli annunci in uno scenario multi-finestra di iPad.
Prerequisiti
- SDK Google Mobile Ads 7.53.0 o versioni successive
- Abilitare il supporto delle scene nel progetto
- Implementa almeno un formato dell'annuncio
Impostare la scena in una richiesta di annuncio
Per ricevere un annuncio adatto a una finestra specifica, trasmetti il 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 = 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) {}]; }
In modalità di test, le richieste di annunci non andranno a buon fine e verrà visualizzato il seguente errore se la tua app multiscena richiede un annuncio senza passare 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 viene soddisfatta, ma la presentazione dell'annuncio non andrà a buon fine se l'annuncio deve essere presentato in una finestra non a schermo intero. Il messaggio di errore in questo caso è:
<Google> Ad cannot be presented. The full screen ad content size exceeds the current window size.
Crea la richiesta di annuncio in viewDidAppear:
Nel caso della modalità multi-finestra, è necessario disporre di una scena della finestra per
l'invio di richieste di annunci. Poiché non è ancora stata aggiunta una visualizzazione a una finestra in
viewDidLoad:
, devi creare le richieste di annunci in viewDidAppear:
dove la scena della finestra è impostata a quel punto.
Tieni presente che viewDidAppear:
può essere chiamato più di una volta durante il ciclo di vita di un'app. Ti consigliamo di racchiudere il codice di inizializzazione della richiesta di annuncio in un
flag che indica se è già stato eseguito.
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; } }
Ridimensionamento maniglie
Gli utenti possono trascinare le scene in qualsiasi momento, modificando le dimensioni delle finestre dopo aver effettuato 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 viene ridimensionata, ma
puoi anche ascoltare
windowScene:didUpdateCoordinateSpace:interfaceOrientation:traitCollection:
per modifiche specifiche della scena 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 è necessario aggiornare un annuncio a schermo intero 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(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
Puoi gestire il ridimensionamento delle finestre nello stesso modo in cui gestisci la rotazione delle finestre. È responsabilità della tua app garantire che l'annuncio banner si adatti alle nuove dimensioni della finestra.
L'esempio seguente 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 = 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]; }
Annuncio nativo
Hai il controllo del rendering degli annunci nativi e sei responsabile di assicurarti che vengano visualizzati all'interno di una visualizzazione ridimensionata, in modo simile al resto dei contenuti della tua app.
Problemi noti
Al momento, gli annunci multi-finestra e in modalità schermo diviso sono supportati solo in modalità verticale. Quando richiedi un annuncio in modalità orizzontale, riceverai il seguente messaggio di log.
<Google> Ad cannot be presented. The full screen ad content size exceeds the
current window size.