自 iOS 13 起,應用程式可在 iPad 上支援多個視窗,這表示使用者可以與應用程式 UI 的多個同時副本互動。每個視窗都可以建立為不同的大小,且隨時可以調整大小,這會影響廣告的載入和呈現方式。
本指南旨在說明在 iPad 多視窗情境中正確顯示廣告的最佳做法。
必要條件
- Google Mobile Ads SDK 7.53.0 以上版本
- 在專案中啟用場景支援功能
- 導入至少一種廣告格式
在廣告請求中設定場景
為了接收適合特定視窗的廣告,您可以將檢視畫面的 windowScene
傳遞至廣告請求。Google Mobile Ads 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 Mobile Ads 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.