Suporte a várias janelas no iPad

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

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

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.