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 influisce sul modo in cui gli annunci vengono caricati e presentati.

Questa guida ha lo scopo di mostrare le best practice per eseguire correttamente il rendering degli annunci in uno scenario multi-finestra per iPad.

Prerequisiti

Preparare la scena in una richiesta di annuncio

Per ricevere un annuncio che si adatta 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 quella 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, se l'app multiscena richiede un annuncio senza passare una scena, le richieste di annunci non andranno a buon fine con il seguente errore:

<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 riesce se viene visualizzato su 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:

Il caso della modalità multi-finestra introduce un requisito di avere una scena di una finestra per l'invio di richieste di annunci. Poiché non è ancora stata aggiunta una vista a una finestra in viewDidLoad:, dovresti creare richieste di annunci in viewDidAppear:, dove a quel punto la scena della finestra è impostata.

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;
  }
}

Gestire il ridimensionamento

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 nel momento in cui viene eseguito il ridimensionamento. Il codice campione riportato di seguito utilizza viewWillTransitionToSize:withTransitionCoordinator: per ricevere una notifica quando la finestra del controller della vista root ruota o si ridimensiona, ma puoi anche ascoltare windowScene:didUpdateCoordinateSpace:interfaceOrientation:traitCollection: per modifiche specifiche delle scene delle finestre.

Interstitial e annuncio 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];
    }
  }];
}

Puoi gestire il ridimensionamento delle finestre come faresti per la rotazione delle finestre. L'app ha la responsabilità di garantire che l'annuncio banner si adatti alle dimensioni della nuova 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

Sei tu ad avere il controllo della visualizzazione degli annunci nativi e hai la responsabilità di assicurarti che l'annuncio nativo venga visualizzato all'interno di una visualizzazione ridimensionata, in modo simile agli altri contenuti dell'app.

Problemi noti

Al momento, gli annunci multi-finestra e a 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.