Compatibilidad con varias Windows en iPad

A partir de iOS 13, las aplicaciones pueden admitir varias ventanas en el 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 de tamaño en cualquier momento, lo que tiene consecuencias en 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 correctamente en una situación de varias ventanas en iPad.

Requisitos previos

Establece la escena 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 completa la solicitud de anuncio, pero se producirá un error si se presenta en una ventana que no es de pantalla completa. El mensaje de error en este caso es el siguiente:

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

Compila la solicitud de anuncio en viewDidAppear:

El caso del modo multiventana introduce el requisito de tener una escena de ventana para enviar solicitudes de anuncios. Como aún no se agregó una vista a una ventana en viewDidLoad:, debes compilar solicitudes de anuncios en viewDidAppear:, donde la escena de la ventana se establece en ese momento.

Ten en cuenta que se puede llamar a viewDidAppear: más de una vez durante el ciclo de vida de una app. Te recomendamos que una el código de inicialización de la solicitud de anuncio 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 cambiar el tamaño de los controladores

Los usuarios pueden arrastrar escenas en cualquier momento y cambiar el tamaño de las ventanas después de realizar una solicitud de anuncio. Depende de ti solicitar un anuncio nuevo cuando se cambie 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 detectar 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 se debe actualizar un anuncio de 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 de la misma manera que lo haces con la rotación. Tu app es responsable de garantizar que el anuncio de banner se ajuste al nuevo tamaño de la 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

Tienes el control de la renderización de los anuncios nativos y eres responsable de garantizar que el anuncio nativo se renderice dentro de una vista con el tamaño modificado, similar al resto del contenido de tu app.

Problemas conocidos

Actualmente, los anuncios de pantalla dividida y multiventana solo son compatibles con 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.