A partir do iOS 13, os aplicativos podem oferecer suporte a várias janelas no iPad. Isso significa que os usuários podem interagir com várias cópias simultâneas da interface de um app. Cada janela pode ser criada em tamanhos diferentes e redimensionada a qualquer momento, o que afeta a forma como os anúncios são carregados e apresentados.
Este guia tem como objetivo mostrar as práticas recomendadas para renderizar anúncios corretamente em um cenário de várias janelas do iPad.
Pré-requisitos
- SDK dos anúncios para dispositivos móveis do Google 7.53.0 ou mais recente
- Ativar o suporte a cenas no projeto
- Implemente pelo menos um formato de anúncio
Definir o cenário em uma solicitação de anúncio
Para receber um anúncio que se ajuste a uma janela específica, transmita o
windowScene
da visualização para a solicitação de anúncio. O SDK dos anúncios para dispositivos móveis do Google retorna um anúncio com
tamanho válido para essa cena.
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) {}]; }
No modo de teste, as solicitações de anúncios vão falhar com o seguinte erro se o app com várias cenas solicitar um anúncio sem transmitir uma cena:
<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.
No modo de produção, a solicitação de anúncio é atendida, mas a apresentação do anúncio vai falhar se ele for apresentado em uma janela que não seja de tela cheia. A mensagem de erro nesse caso é:
<Google> Ad cannot be presented. The full screen ad content size exceeds the current window size.
Crie a solicitação de anúncio em viewDidAppear:
O caso de várias janelas introduz um requisito de ter uma cena de janela para
enviar solicitações de anúncios. Como uma visualização ainda não foi adicionada a uma janela em
viewDidLoad:
, crie solicitações de anúncio em viewDidAppear:
,
onde a cena da janela é definida até esse ponto.
O método viewDidAppear:
pode ser chamado mais de uma vez durante o ciclo de vida
de um app. Recomendamos que você envolva o código de inicialização da solicitação de anúncio em uma
flag que indique se isso já foi feito.
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; } }
Alça de redimensionamento
Os usuários podem arrastar cenas a qualquer momento, mudando os tamanhos das janelas depois que uma solicitação
de anúncio é feita. Cabe a você solicitar um novo anúncio quando o redimensionamento acontecer.
O código de exemplo abaixo usa
viewWillTransitionToSize:withTransitionCoordinator:
para receber notificações quando a janela do controlador de visualização raiz gira ou redimensiona, mas
você também pode detectar
windowScene:didUpdateCoordinateSpace:interfaceOrientation:traitCollection:
para mudanças específicas da cena da janela.
Anúncio intersticial e premiado
O SDK dos anúncios para dispositivos móveis do Google oferece o método
canPresentFromViewController:error:
para determinar se um intersticial ou um
anúncio premiado é válido ou não. Assim, você pode verificar se algum anúncio em tela cheia
precisa ser atualizado sempre que o tamanho da janela muda.
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
Você pode lidar com o redimensionamento de janelas da mesma forma que faz com a rotação de janelas. Seu app é responsável por garantir que o anúncio de banner se ajuste ao novo tamanho da janela.
O exemplo abaixo cria um novo banner adaptável com a nova largura da janela:
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]; }
Anúncio nativo
Você controla a renderização de anúncios nativos e é responsável por garantir que o anúncio nativo seja renderizado em uma visualização redimensionada, semelhante ao restante do conteúdo do app.
Problemas conhecidos
No momento, os anúncios de várias janelas e de tela dividida são compatíveis apenas no modo retrato. Você vai receber a seguinte mensagem de registro ao solicitar um anúncio no modo paisagem.
<Google> Ad cannot be presented. The full screen ad content size exceeds the
current window size.