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 de tamaño en cualquier momento, lo que tiene implicaciones en la forma en que se cargan y presentan los anuncios.
En esta guía, se muestran las prácticas recomendadas para renderizar anuncios correctamente en un escenario de varias ventanas en iPad.
Requisitos previos
- SDK de anuncios de Google para dispositivos móviles 7.53.0 o una versión posterior
- Habilita la compatibilidad con escenas en tu proyecto
- Implementa al menos un formato de anuncio.
Cómo configurar 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 devuelve un anuncio con un tamaño válido para esa escena.
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 el modo de prueba, las solicitudes de anuncios fallarán con el siguiente error si tu app multiescena 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, la solicitud de anuncio se completa, pero la presentación del anuncio fallará si este se debe presentar en una ventana que no sea 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 viewDidAppear:
El caso de multiventana introduce 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 compilar 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 que encapsules el código de inicialización de la solicitud de anuncio en una marca que indique si ya se realizó.
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 del controlador
Los usuarios pueden arrastrar escenas en cualquier momento y cambiar el tamaño de las ventanas después de que se haya realizado una solicitud de anuncio. Depende de ti solicitar un anuncio nuevo cuando se produce el cambio de tamaño.
El siguiente código de muestra 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, lo que te permite verificar si es necesario actualizar algún 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(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]; } }]; }
Banner
Puedes controlar el cambio de tamaño de la ventana de la misma manera que lo haces con la rotación de la ventana. 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 banner adaptable nuevo 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 = 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]; }
Anuncio nativo
Tienes el control de la renderización de los anuncios nativos y eres responsable de garantizar que se rendericen dentro de una vista con el tamaño cambiado, de manera similar al resto del contenido de tu app.
Problemas conocidos
Actualmente, los anuncios de multiventana y pantalla dividida solo se admiten en 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.