Compatibilidad con varias Windows en iPad

A partir de iOS 13, las aplicaciones pueden admitir varias ventanas en iPad, lo que significa que los usuarios pueden interactuar con varias copias simultáneas de la IU de una app. Cada ventana se puede crear en diferentes tamaños y se puede cambiar en cualquier momento, lo que afecta la forma en que se cargan y presentan los anuncios.

El objetivo de esta guía es mostrarte las prácticas recomendadas para renderizar anuncios de forma correcta en una situación multiventana de iPad.

Requisitos previos

Cómo establecer el escenario en una solicitud de anuncio

Para recibir un anuncio que se ajuste a una ventana específica, debes pasar el windowScene de la vista a la solicitud de anuncio. El SDK de anuncios de Google para dispositivos móviles muestra un anuncio con un tamaño válido para esa escena.

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 el modo de prueba, las solicitudes de anuncios fallarán con el siguiente error si tu app de varias escenas solicita un anuncio sin pasar una escena:

<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 el modo de producción, se llena la solicitud de anuncio, pero la presentación del anuncio fallará si este se presenta en una ventana que no es de pantalla completa. En este caso, el mensaje de error es el siguiente:

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

Crea la solicitud de anuncio en viewDoneAppear:

El caso del modo multiventana presenta el requisito de tener una escena de ventana para enviar solicitudes de anuncios. Dado que aún no se agregó una vista a una ventana en viewDidLoad:, debes crear solicitudes de anuncios en viewDidAppear:, donde la escena de la ventana se establece en ese punto.

Ten en cuenta que se puede llamar a viewDidAppear: más de una vez durante el ciclo de vida de una app. Te recomendamos unir el código de inicialización de la solicitud de anuncios en una marca que indique si ya se hizo.

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

Cómo controlar el cambio de tamaño

Los usuarios pueden arrastrar escenas en cualquier momento y cambiar el tamaño de la ventana después de que se ha realizado una solicitud de anuncio. Puedes solicitar un anuncio nuevo cuando se cambia el tamaño. En el siguiente código de muestra, se usa viewWillTransitionToSize:withTransitionCoordinator: para recibir notificaciones cuando la ventana del controlador de vista raíz rota o cambia de tamaño, pero también puedes escuchar windowScene:didUpdateCoordinateSpace:interfaceOrientation:traitCollection: para los cambios específicos de la escena de la ventana.

Anuncio intersticial y recompensado

El SDK de anuncios de Google para dispositivos móviles proporciona el método canPresentFromViewController:error: para determinar si un anuncio intersticial o recompensado es válido o no, lo que te permite verificar si es necesario actualizar un anuncio en pantalla completa cada vez que cambia el tamaño de la ventana.

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

Puedes controlar el cambio de tamaño de la ventana del mismo modo que lo haces con la rotación de ventanas. Tu app es responsable de garantizar que el anuncio de banner se ajuste al nuevo tamaño de ventana.

En el siguiente ejemplo, se crea un nuevo banner adaptable con el nuevo ancho de la ventana:

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

Anuncio nativo

Tú controlas la renderización de anuncios nativos y eres responsable de garantizar que estos se rendericen dentro de una vista a la que se le cambió el tamaño, de forma similar al resto del contenido de tu app.

Errores conocidos

Actualmente, los anuncios multiventana y de pantalla dividida solo se admiten en el modo vertical. Recibirás el siguiente mensaje de registro cuando solicites un anuncio en modo horizontal.

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