Поддержка нескольких Windows на iPad

Начиная с iOS 13, приложения могут поддерживать несколько окон на iPad, то есть пользователи могут одновременно взаимодействовать с несколькими копиями пользовательского интерфейса приложения. Каждое окно может быть создано в разных размерах и изменено в любое время, что влияет на то, как загружаются и отображаются объявления.

Цель этого руководства — показать вам лучшие практики правильного отображения рекламы в многооконном сценарии iPad.

Предварительные условия

Задайте сцену в запросе объявления

Чтобы получить рекламу, подходящую для определенного окна, вы передаете windowScene представления в запрос объявления. Google Mobile Ads SDK возвращает объявление с допустимым размером для этой сцены.

Быстрый

func loadInterstitial() {
  let request = GADRequest()
  request.scene = view.window?.windowScene

  GADInterstitialAd.load(withAdUnitID: "[AD_UNIT_ID]",
      request: request) { ad, error in }
}

Цель-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) {}];
}

В тестовом режиме запросы объявлений завершатся ошибкой со следующей ошибкой, если ваше многосценное приложение запрашивает рекламу без передачи сцены:

<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.

В производственном режиме запрос объявления заполняется, но представление объявления не удастся, если оно будет представлено в не полноэкранном окне. Сообщение об ошибке в этом случае:

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

Создайте запрос объявления в viewDidAppear:

В случае с несколькими окнами требуется наличие сцены окна для отправки запросов рекламы. Поскольку представление еще не добавлено в окно в viewDidLoad: , вместо этого вам следует создавать запросы объявлений в viewDidAppear: где сцена окна задается этой точкой.

Обратите внимание, что viewDidAppear: может вызываться более одного раза в течение жизненного цикла приложения. Мы рекомендуем поместить код инициализации запроса объявления в флаг, указывающий, было ли это уже выполнено.

Быстрый

override func viewDidAppear(_ animated: Bool) {
  super.viewDidAppear(animated)
  if !requestInitialized {
    loadInterstitial()
    requestInitialized = true
  }
}

Цель-C

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  if (!_requestInitialized) {
    [self loadInterstitial];
    _requestInitialized = YES;
  }
}

Изменение размера ручки

Пользователи могут перетаскивать сцены в любое время, изменяя размеры окон после запроса рекламы. Вы можете запросить новое объявление при изменении размера. В приведенном ниже примере кода используется viewWillTransitionToSize:withTransitionCoordinator: для получения уведомлений, когда окно корневого контроллера представления вращается или изменяет размер, но вы также можете прослушивать windowScene:didUpdateCoordinateSpace:interfaceOrientation:traitCollection: для конкретных изменений сцены окна.

Межстраничная реклама и реклама с вознаграждением

Google Mobile Ads SDK предоставляет метод canPresentFromViewController:error: для определения того, является ли межстраничное объявление или объявление с вознаграждением действительным или нет, что дает вам возможность проверить, нужно ли обновлять любое полноэкранное объявление при изменении размера окна.

Быстрый

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()
    }
  }
}

Цель-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];
    }
  }];
}

Вы можете обрабатывать изменение размера окна так же, как и вращение окна. Ваше приложение отвечает за то, чтобы баннерная реклама соответствовала новому размеру окна.

В приведенном ниже примере создается новый адаптивный баннер с новой шириной окна:

Быстрый

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)
}

Цель-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];
}

Нативное объявление

Вы контролируете отображение нативной рекламы и несете ответственность за то, чтобы нативная реклама отображалась в представлении с измененным размером, как и остальной контент вашего приложения.

Известные проблемы

В настоящее время реклама в нескольких окнах и на разделенном экране поддерживается только в портретном режиме. Вы получите следующее сообщение журнала при запросе объявления в альбомном режиме.

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

Начиная с iOS 13, приложения могут поддерживать несколько окон на iPad, то есть пользователи могут одновременно взаимодействовать с несколькими копиями пользовательского интерфейса приложения. Каждое окно может быть создано в разных размерах и изменено в любое время, что влияет на то, как загружаются и отображаются объявления.

Цель этого руководства — показать вам лучшие практики правильного отображения рекламы в многооконном сценарии iPad.

Предварительные условия

Задайте сцену в запросе объявления

Чтобы получить рекламу, подходящую для определенного окна, вы передаете windowScene представления в запрос объявления. Google Mobile Ads SDK возвращает объявление с допустимым размером для этой сцены.

Быстрый

func loadInterstitial() {
  let request = GADRequest()
  request.scene = view.window?.windowScene

  GADInterstitialAd.load(withAdUnitID: "[AD_UNIT_ID]",
      request: request) { ad, error in }
}

Цель-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) {}];
}

В тестовом режиме запросы объявлений завершатся ошибкой со следующей ошибкой, если ваше многосценное приложение запрашивает рекламу без передачи сцены:

<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.

В производственном режиме запрос объявления заполняется, но представление объявления не удастся, если оно будет представлено в не полноэкранном окне. Сообщение об ошибке в этом случае:

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

Создайте запрос объявления в viewDidAppear:

В случае с несколькими окнами возникает требование наличия оконной сцены для отправки запросов рекламы. Поскольку представление еще не добавлено в окно в viewDidLoad: , вместо этого вам следует создавать запросы объявлений в viewDidAppear: где сцена окна задается этой точкой.

Обратите внимание, что viewDidAppear: может вызываться более одного раза в течение жизненного цикла приложения. Мы рекомендуем поместить код инициализации запроса объявления в флаг, указывающий, было ли это уже выполнено.

Быстрый

override func viewDidAppear(_ animated: Bool) {
  super.viewDidAppear(animated)
  if !requestInitialized {
    loadInterstitial()
    requestInitialized = true
  }
}

Цель-C

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  if (!_requestInitialized) {
    [self loadInterstitial];
    _requestInitialized = YES;
  }
}

Изменение размера ручки

Пользователи могут перетаскивать сцены в любое время, изменяя размеры окон после запроса рекламы. Вы можете запросить новое объявление при изменении размера. В приведенном ниже примере кода используется viewWillTransitionToSize:withTransitionCoordinator: для получения уведомлений, когда окно корневого контроллера представления вращается или изменяет размер, но вы также можете прослушивать windowScene:didUpdateCoordinateSpace:interfaceOrientation:traitCollection: для конкретных изменений сцены окна.

Межстраничная реклама и реклама с вознаграждением

Google Mobile Ads SDK предоставляет метод canPresentFromViewController:error: для определения того, является ли межстраничное объявление или объявление с вознаграждением действительным или нет, что дает вам возможность проверить, нужно ли обновлять любое полноэкранное объявление при изменении размера окна.

Быстрый

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()
    }
  }
}

Цель-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];
    }
  }];
}

Вы можете обрабатывать изменение размера окна так же, как и вращение окна. Ваше приложение отвечает за то, чтобы баннерная реклама соответствовала новому размеру окна.

В приведенном ниже примере создается новый адаптивный баннер с новой шириной окна:

Быстрый

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)
}

Цель-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];
}

Нативное объявление

Вы контролируете отображение нативной рекламы и несете ответственность за то, чтобы нативная реклама отображалась в представлении с измененным размером, как и остальной контент вашего приложения.

Известные проблемы

В настоящее время реклама в нескольких окнах и на разделенном экране поддерживается только в портретном режиме. Вы получите следующее сообщение журнала при запросе объявления в альбомном режиме.

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