Начиная с iOS 13, приложения на iPad могут поддерживать несколько окон , что означает, что пользователи могут взаимодействовать с несколькими одновременно отображаемыми копиями пользовательского интерфейса приложения. Каждое окно может быть создано разных размеров и может изменяться в любое время, что влияет на то, как загружается и отображается реклама.
Данное руководство призвано показать вам лучшие практики для корректного отображения рекламы в многооконном режиме на iPad.
Предварительные требования
- Google Mobile Ads SDK 7.53.0 или выше
- Включите поддержку сцен в вашем проекте.
- Внедрить как минимум один рекламный формат.
Создайте контекст в запросе на показ рекламы.
Чтобы получить рекламу, подходящую для определенного окна, необходимо передать windowScene представления в запрос на показ рекламы. Google Mobile Ads SDK вернет рекламу с допустимым размером для этой сцены.
Быстрый
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) {}]; }
В тестовом режиме запросы на показ рекламы в многосценовом приложении без указания сцены завершатся с ошибкой следующего характера:
<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 } }
Objective-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(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]; } }]; }
Баннер
Изменение размера окна можно обрабатывать так же, как и поворот окна. Ваше приложение отвечает за то, чтобы баннерная реклама соответствовала новому размеру окна.
В приведенном ниже примере создается новый адаптивный баннер с новой шириной окна:
Быстрый
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]; }
Нативная реклама
Вы контролируете отображение нативной рекламы и отвечаете за то, чтобы нативная реклама отображалась в масштабированном окне, аналогично остальному содержимому вашего приложения.
Известные проблемы
В настоящее время показ рекламы в нескольких окнах и в режиме разделенного экрана поддерживается только в портретном режиме. При запросе рекламы в альбомном режиме вы получите следующее сообщение в журнале.
<Google> Ad cannot be presented. The full screen ad content size exceeds the
current window size.