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) {}];
}

テストモードにおいてマルチシーン アプリがシーン情報を渡さずに広告をリクエストした場合は、次のエラーが発生して広告リクエストが失敗します。

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