Начиная с iOS 13, приложения могут поддерживать несколько окон на iPad, то есть пользователи могут одновременно взаимодействовать с несколькими копиями пользовательского интерфейса приложения. Каждое окно может быть создано в разных размерах и изменено в любое время, что влияет на то, как загружаются и отображаются объявления.
Цель этого руководства — показать вам лучшие практики правильного отображения рекламы в многооконном сценарии iPad.
Предварительные условия
- Google Mobile Ads SDK 7.53.0 или более поздней версии
- Включите поддержку сцен в вашем проекте
- Внедрите хотя бы один формат объявлений.
Задайте сцену в запросе объявления
Чтобы получить рекламу, подходящую для определенного окна, вы передаете 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.
Предварительные условия
- Google Mobile Ads SDK 7.53.0 или более поздней версии
- Включите поддержку сцен в вашем проекте
- Внедрите хотя бы один формат объявлений.
Задайте сцену в запросе объявления
Чтобы получить рекламу, подходящую для определенного окна, вы передаете 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.