Supporto di più Windows su iPad

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 illustra le best practice per il rendering corretto degli annunci in uno scenario con più finestre su iPad.

Prerequisiti

Impostare la scena in una richiesta di annuncio

Per ricevere un annuncio adatto a una finestra specifica, devi passare 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 non andranno a buon fine con 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. 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 di più finestre introduce il requisito di avere una scena della finestra per l'invio di richieste di annunci. Poiché non è stata ancora aggiunta una vista a una finestra in viewDidLoad:, devi creare le richieste di annunci in viewDidAppear: dove la scena della finestra è impostata in quel momento.

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 annunci in un indicatore che indichi 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;
  }
}

Gestire il ridimensionamento

Gli utenti possono trascinare le scene in qualsiasi momento, modificando le dimensioni della finestra dopo aver effettuato una richiesta di annunci. Spetta a te richiedere un nuovo annuncio quando viene modificato il ridimensionamento. Il codice di esempio riportato di seguito utilizza viewWillTransitionToSize:withTransitionCoordinator: per ricevere una notifica quando la finestra del view controller principale viene ruotata o ridimensionata, ma puoi anche ascoltare windowScene:didUpdateCoordinateSpace:interfaceOrientation:traitCollection: per le modifiche specifiche della scena della finestra.

Annuncio interstitial e con premio

L'SDK Google Mobile Ads fornisce il metodocanPresentFromViewController:error: per determinare se un annuncio in-app o con premio è valido o meno, consentendoti 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(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];
    }
  }];
}

Puoi gestire il ridimensionamento della finestra nello stesso modo in cui gestisci la rotazione della finestra. È compito 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 = 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

Hai il controllo del rendering degli annunci nativi e sei responsabile di garantire che l'annuncio nativo venga visualizzato in una visualizzazione ridimensionata, in modo simile al resto dei contenuti dell'app.

Problemi noti

Al momento, gli annunci in più finestre e con schermo diviso sono supportati solo in modalità Ritratto. 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.