Prise en charge de plusieurs fenêtres sur iPad

Depuis iOS 13, les applications peuvent être compatibles avec plusieurs fenêtres sur iPad, ce qui 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 implications sur la façon dont les annonces sont chargées et présentées.

Ce guide a pour objectif de vous présenter les bonnes pratiques pour afficher correctement les annonces dans un scénario multifenêtre sur iPad.

Prérequis

Définir la scène dans une demande d'annonce

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

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

En mode test, les demandes d'annonces échoueront avec l'erreur suivante si votre application multisystème 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 la présentation de l'annonce échouera si elle doit être présentée dans une fenêtre non 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éer la demande d'annonce dans viewDidAppear :

Le mode multifenêtre nécessite une scène de fenêtre pour envoyer des demandes d'annonces. Étant donné qu'une vue n'a pas 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 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 demande d'annonce dans un indicateur indiquant si cela a déjà été fait.

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

Gérer le redimensionnement

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

Annonce interstitielle et avec récompense

Google Mobile Ads SDK fournit la méthode canPresentFromViewController:error: pour déterminer si une annonce interstitielle ou avec récompense est valide ou non. Vous pouvez ainsi vérifier si une annonce 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(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];
    }
  }];
}

Vous pouvez gérer le redimensionnement de la fenêtre de la même manière que la rotation de la fenêtre. Votre application est chargée de 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 = 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];
}

Annonce native

Vous contrôlez l'affichage des annonces natives et vous êtes responsable de leur affichage dans une vue redimensionnée, comme le reste du contenu de votre application.

Problèmes connus

Actuellement, les annonces multifenêtres et en é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.