支持在 iPad 上同时显示多个窗口

从 iOS 13 开始,应用可以在 iPad 上显示多个窗口,这意味着用户可以同时与某个应用的多个界面互动。每个窗口都能够以不同的窗口大小显示,且随时可以调整,这会影响广告的加载和展示方式。

本指南旨在介绍在 iPad 多窗口场景下正确呈现广告的最佳做法。

前提条件

在广告请求中设置场景

要接收适合特定窗口的广告,请将视图的 windowScene 传递给广告请求。Google 移动广告 SDK 会返回尺寸适合该场景的广告。

- (void)loadInterstitial {
  GADRequest *request = [GADRequest request];
  request.scene = self.view.window.windowScene;

  [self.interstitial loadRequest:request];
}
<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.

在 viewDidAppear 中构建广告请求:

在多窗口情况下,需要具有用于发送广告请求的窗口场景。由于尚未将视图添加到 viewDidLoad: 中的窗口,因此您应改为在 viewDidAppear: 中构建广告请求,此时会设置窗口场景。

请注意,在应用的生命周期内,可以多次调用 viewDidAppear:。我们建议您将广告请求初始化代码封装在标记中,以表明是否已完成广告请求初始化。

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

调整窗口大小

用户随时可以拖动场景,从而在发出广告请求后更改窗口大小。调整窗口大小时,您可以自行决定是否请求新广告。以下示例代码利用 viewWillTransitionToSize:withTransitionCoordinator: 在旋转或调整根视图控制器的窗口时接收通知,不过,您可以通过监听 windowScene:didUpdateCoordinateSpace:interfaceOrientation:traitCollection: 来获取窗口场景特有的更改。

插页式广告和激励广告

Google 移动广告 SDK 提供了用于确定插页式广告或激励广告是否有效的 canPresentFromViewController:error: 方法,以便您在窗口大小发生变化时检查是否需要刷新全屏广告。

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

您可以像旋转窗口那样调整窗口大小。您的应用负责确保横幅广告适合新的窗口大小。

在下例中,我们使用新窗口宽度创建了一个新自适应横幅广告:

- (void)viewWillTransitionToSize:(CGSize)size
      withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)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.