从 iOS 13 开始,应用可以在 iPad 上显示多个窗口,这意味着用户可以同时与某个应用的多个界面互动。每个窗口都能以不同的大小显示,且窗口大小随时可调,这会影响广告的加载和展示方式。
本指南旨在介绍在 iPad 多窗口模式下正确呈现广告的最佳做法。
前提条件
- Google 移动广告 SDK 7.53.0 或更高版本
- 在项目中启用场景 (Scene) 支持
- 至少实现一种广告格式
在广告请求中设置场景
如要确保接收到的广告适合特定窗口的大小,请将视图的 windowScene
传递给广告请求。Google 移动广告 SDK 会根据该场景的尺寸,返回大小合适的广告。
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) {}]; }
在测试模式下,如果您的多场景应用只请求广告而不传递场景,广告请求就会失败,并提示以下错误:
<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:
。我们建议您将广告请求初始化代码封装在标记中,该标记用于表明是否已完成广告请求初始化。
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; } }
窗口大小变化时的处理方式
用户可以随时拖动场景,在系统发出广告请求后更改窗口大小。窗口大小发生变化时,您可以自行决定是否请求新广告。以下示例代码利用 viewWillTransitionToSize:withTransitionCoordinator:
在根视图控制器的窗口发生旋转或大小调整时接收通知,不过,您也可以通过监听 windowScene:didUpdateCoordinateSpace:interfaceOrientation:traitCollection:
来接收与窗口场景特有的更改相关的通知。
插页式广告和激励广告
Google 移动广告 SDK 提供了用于确定插页式广告或激励广告是否有效的 canPresentFromViewController:error:
方法,以便您在窗口大小发生变化时检查是否需要刷新全屏广告。
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]; } }]; }
横幅
窗口大小变化时的处理方式与窗口旋转时的处理方式相同。您的应用负责确保横幅广告适合新的窗口大小。
以下示例中根据新的窗口宽度创建了新的自适应横幅广告:
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]; }
原生广告
您可以控制原生广告的呈现,并负责确保原生广告在大小调整后的视图内呈现,并且广告外观和风格与应用内容的其他部分类似。
已知问题
目前仅支持以纵向模式显示多窗口广告和分屏广告。如果在横屏模式下发出广告请求,您会收到以下日志消息。
<Google> Ad cannot be presented. The full screen ad content size exceeds the
current window size.