Compatibilité avec plusieurs fenêtres Windows sur iPad

À partir d'iOS 13, les applications sont compatibles avec plusieurs fenêtres sur l'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 redimensionnée à tout moment, ce qui a des conséquences sur la façon dont les annonces sont chargées et présentées.

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

Prérequis

Planter le décor dans une demande d'annonce

Pour recevoir une annonce qui s'adapte à une fenêtre spécifique, transmettez l'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 = 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 demandes d'annonces échouent 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 se remplit, mais la présentation de l'annonce échouera si elle doit s'afficher dans une fenêtre qui n'est pas en plein écran. Dans ce cas, le message d’erreur 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:

Le mode multifenêtre nécessite de disposer d'une scène 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 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 demande d'annonce dans un indicateur indiquant 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;
  }
}

Gérer le redimensionnement

Les utilisateurs peuvent faire glisser les scènes à tout moment et modifier la taille de la fenêtre après l'envoi d'une demande d'annonce. Il vous appartient de demander une nouvelle annonce lors du redimensionnement. 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 connaître les modifications spécifiques à la scène de fenêtre.

Interstitiel et annonce 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 plein écran doit être actualisée lorsque 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 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 devez vous assurer que l'annonce native s'affiche dans une vue redimensionnée, comme le reste du contenu de votre application.

Problèmes connus

Actuellement, les annonces multifenêtre et écran partagé ne sont compatibles qu'en mode Portrait. Lorsque vous demandez une annonce en mode Paysage, vous recevez le message de journal suivant :

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