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
- SDK de anuncios de Google para dispositivos móviles 7.53.0 o una versión posterior
- Habilita la compatibilidad de escena en tu proyecto
- Implementa al menos un formato del anuncio.
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]; } }]; }
Banner
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.