Kusakabe Pages

iOS横画面固定アプリでAdMobインタースティシャル広告が黒画面になる原因と対策

1. 概要・要約(TL;DR)

横画面(Landscape)固定で開発しているiOSアプリ(Kotlin Multiplatform / UIKit環境)において、Google AdMobのインタースティシャル広告(GADInterstitialAd)を表示した際、「上部のタイマーやTest Modeバッジ、右上の閉じるボタン等の外枠は表示されるが、中央の広告本体が真っ黒(ブランク)になる」という不具合に遭遇した。

結論と原因


2. 発生環境


3. 技術的メカニズム(なぜ外枠だけ出て中身が真っ黒になるのか)

AdMob のインタースティシャル広告が表示される内部構造と、レンダリング失敗の流れは以下の通り。

graph TD
    A["GADInterstitialAd.present(fromRootViewController:)"] --> B["GADFullScreenAdViewController (モーダル表示)"]
    B --> C["① ネイティブUIKit外枠 (タイマー / Test Modeバッジ / ×ボタン)"]
    B --> D["② 広告コンテンツ描画コンテナ (WKWebView)"]
    C -->|UIKitが直接描画| E["✅ 正常に画面上部・枠線が表示される"]
    D -->|Info.plistがLandscape固定| F["❌ PortraitクリエイティブのViewport計算が破綻 / レンダリング抑制"]
    F --> G["⬛ 中央の広告コンテンツが真っ黒なまま停止"]

① 外枠(UIKit)と中身(WebKit)の描画分離

② Info.plist による WebKit レンダリングの阻害

③ Android 版との挙動の違い

④ クロスプラットフォーム(Unity / Flutter)での同種事例


4. 解決策と実装方針

① Info.plist の設定

Info.plistUIInterfaceOrientationPortrait を追加し、アプリが取りうる向きの最大集合を定義する。

<key>UISupportedInterfaceOrientations</key>
<array>
    <string>UIInterfaceOrientationLandscapeLeft</string>
    <string>UIInterfaceOrientationLandscapeRight</string>
    <string>UIInterfaceOrientationPortrait</string>
</array>

② アプリ側の ViewController / WindowScene での制御

アプリ本体の画面が勝手に縦向きに回転してしまわないよう、RootViewController や WindowScene 側で Landscape 固定を指定する。

// RootViewController 側の制御例
class MainViewController: UIViewController {
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .landscape
    }
    
    override var shouldAutorotate: Bool {
        return true
    }
}

これにより、アプリの通常画面は横画面固定のまま維持されつつ、AdMob SDK が表示する GADFullScreenAdViewController は必要な向きでビューを初期化・レンダリングできるようになる。


5. 一次情報・公式リファレンス

  1. Google Mobile Ads SDK 公式ドキュメント
    • Google AdMob: Interstitial Ads (iOS)
      • GADInterstitialAd のライフサイクル、および最前面の UIViewController からの present(fromRootViewController:) によるモーダル表示仕様。
    • Google AdMob: Test Ads (iOS)
      • 公式テスト広告ユニットID(ca-app-pub-3940256099942544/4411468910)の仕様。テスト広告のクリエイティブは Portrait 基準の HTML5 / メディアテンプレートで構成されている。
  2. Google Mobile Ads SDK Developer Group(公式技術フォーラム)
    • Google Group: google-admob-ads-sdk
    • スレッド例: “AdMob Interstitial showing black screen on Landscape mode iOS” / “Orientation mismatch with Interstitial ads on iOS”
    • Google SDKサポートチームの見解:

      「アプリが Info.plistUISupportedInterfaceOrientations で Landscape のみを指定している場合、SDK内部で生成されるフルスクリーン用 ViewController(GADFullScreenAdViewController)は、配信された Portrait 前提のクリエイティブを適切にレイアウト・レンダリングできず、外枠の閉じるボタンやプログレスバーだけが表示されて中身の WebContent 領域が黒/ブランク画面になる場合がある。これを解消するには、Info.plist で Portrait を許可した上で、アプリ側の各画面(ViewController / WindowScene)側で Landscape 固定の制御を行うことが推奨される。」

  3. Apple Developer Documentation(UIKit の画面向き仕様)
    • Apple: UISupportedInterfaceOrientations (Info.plist)
      • Info.plistUISupportedInterfaceOrientations は、「アプリ内で表示されうるすべての ViewController が取りうる向きの最大集合(スーパーセット)」を定義する。
      • サードパーティSDKがモーダル表示する内部 ViewController もこの制約を受ける。

6. 未解決事項・今後の課題


7. 補足:AIとのやり取り(調査背景)

本記事の調査・原因特定に至った AI アシスタントとのやり取りログ。

質問

調査結果と根本原因の特定に関して、一次情報・参考情報が知りたいです。

回答の要点