Compatibilité avec plusieurs fenêtres Windows sur iPad

À partir d'iOS 13, les applications peuvent prendre en charge plusieurs écrans sur iPad. Cela signifie que les utilisateurs peuvent interagir avec plusieurs copies simultanées de l'interface utilisateur d'une application. Chaque fenêtre peut être créée dans différentes tailles et peut être redimensionnée à tout moment, ce qui a des conséquences sur la façon dont les annonces sont chargées et présentées.

Ce guide vous présente les bonnes pratiques à suivre pour afficher correctement les annonces dans un scénario multifenêtre sur iPad.

Prérequis

Définir la scène dans une requête d'annonce

Pour recevoir une annonce adaptée à une fenêtre spécifique, vous transmettez la windowScene de la vue à la demande d'annonce. Le SDK Google Mobile Ads renvoie une annonce de taille valide pour cette scène.

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) {}];
}

En mode test, les requêtes d'annonces échoueront avec l'erreur suivante si votre application multiscène demande une annonce sans transmettre de scène:

<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.

En mode production, la demande d'annonce est remplie, mais l'affichage de l'annonce échoue si elle doit être présentée dans une fenêtre autre que plein écran. Le message d'erreur dans ce cas est le suivant:

<Google> Ad cannot be presented. The full screen ad content size exceeds the current window size.

Créez la requête d'annonce dans viewDidAppear:

Le cas de la multifenêtre nécessite d'avoir une scène de fenêtre pour envoyer des requêtes d'annonces. Étant donné qu'aucune vue n'a encore été ajoutée à une fenêtre dans viewDidLoad:, vous devez plutôt créer des demandes d'annonces dans viewDidAppear:, où la scène de la fenêtre est définie à ce stade.

Notez que viewDidAppear: peut être appelé plusieurs fois au cours du cycle de vie d'une application. Nous vous recommandons d'encapsuler le code d'initialisation de la requête d'annonce dans un indicateur indiquant s'il a déjà été effectué.

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

Poignée de redimensionnement

Les utilisateurs peuvent faire glisser des scènes à tout moment, en modifiant la taille des fenêtres après avoir envoyé une demande d'annonce. Il vous appartient de demander une nouvelle annonce lorsque le redimensionnement se produit. L'exemple de code ci-dessous utilise viewWillTransitionToSize:withTransitionCoordinator: pour recevoir une notification lorsque la fenêtre du contrôleur de vue racine est pivotée ou redimensionnée, mais vous pouvez également écouter windowScene:didUpdateCoordinateSpace:interfaceOrientation:traitCollection: pour les modifications spécifiques à la scène de la fenêtre.

Annonce interstitielle et avec récompense

Le SDK Google Mobile Ads fournit la méthode canPresentFromViewController:error: pour déterminer si un interstitiel ou une annonce avec récompense est valide ou non. Vous pouvez ainsi vérifier si une annonce en plein écran doit être actualisée chaque fois que la taille de la fenêtre change.

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

Vous pouvez gérer le redimensionnement de la fenêtre de la même manière que la rotation. Votre application doit s'assurer que la bannière publicitaire s'adapte à la nouvelle taille de la fenêtre.

L'exemple ci-dessous crée une bannière adaptative avec la nouvelle largeur de fenêtre:

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

Annonce native

Vous contrôlez l'affichage des annonces natives et vous devez vous assurer qu'elles s'affichent dans une vue redimensionnée, comme le reste du contenu de votre application.

Problèmes connus

Actuellement, les annonces multifenêtre et en mode Écran partagé ne sont compatibles qu'en mode Portrait. Le message de journal suivant s'affiche lorsque vous demandez une annonce en mode paysage.

<Google> Ad cannot be presented. The full screen ad content size exceeds the
current window size.