Compatibilité avec plusieurs fenêtres Windows sur iPad

À partir d'iOS 13, les applications peuvent prendre en charge plusieurs fenêtres sur iPad, ce qui signifie que les utilisateurs peuvent interagir avec plusieurs copies simultanées de l'UI d'une application. Chaque fenêtre peut être créée dans différentes tailles et 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 a pour but de vous présenter les bonnes pratiques pour afficher correctement les annonces dans un scénario multifenêtre sur iPad.

Prérequis

Définir le contexte 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. Le SDK Google Mobile Ads renvoie une annonce dont la taille est 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 échouent avec l'erreur suivante si votre application multiscreen 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 satisfaite, 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éez la demande d'annonce dans viewDidAppear :

Dans le cas du multifenêtre, il est nécessaire d'avoir une scène de fenêtre pour envoyer des demandes 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 moment-là.

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 qui indique si l'opération a déjà été effectuée.

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

Redimensionner les poignées

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

Annonces interstitielles et avec récompense

Le SDK Google Mobile Ads 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 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(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 responsable de l'adaptation de la bannière publicitaire à 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 ê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'avec le 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.