支援多個 Windows 版的 iPad

從 iOS 13 開始,應用程式可以在 iPad 上支援多個視窗,這表示使用者可以與應用程式的多個 UI 並行副本互動。每個視窗都可建立不同大小,且可隨時調整大小,這會影響廣告載入和顯示的方式。

本指南旨在介紹在 iPad 多視窗模式下,正確顯示廣告的最佳做法。

必要條件

設定廣告請求中的場景

如要接收符合特定視窗的廣告,請將檢視畫面的 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) {}];
}

在測試模式中,如果 Multiscene 應用程式請求廣告但未傳遞場景,廣告請求就會失敗並顯示下列錯誤:

<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.

在 view 威 Appear 建立廣告請求:

使用多視窗模式的情況,是必須設置一個視窗場景,才能傳送廣告請求。由於尚未將檢視畫面新增至 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.