【SwiftUI】iPad OSでAdMobテスト広告が表示されない場合の対処方法

SwiftUI

Pure SwiftUIでアプリを開発し、iOSでテストして問題無かったのでiPadで確認して見るとAdMobの広告が表示されていませんでした。

その時出ていたのが以下のエラーメッセージです。

 <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翻訳


無効なリクエスト。マルチシーンをサポートするアプリケーションには、GADRequestシーンプロパティを設定する必要があります。テストモードでは、未設定のプロパティをエラーとして扱います。

「テストモードでは」ということなので、本番では問題無いかもしれませんが、
取り敢えず対処していきましょう。

対処法1 マルチタスクのサポートをしない

SwiftUIではデフォルトでマルチタスク対応しています。

「マルチシーンをサポートするアプリケーションには」マルチタスクのサポートを止めれば解決します。

プロジェクト設定のSupports multiple windowをオフにしてしまいましょう。

SplitViewなどで使えなくて良いならこれが一番手っ取り早いです。

対処法2 GADRequestにUIWindowSceneを設定する

GADRequestにシーンを設定しろとの事なのでその通りにします。

この例は暫定的に対処しているので本当はよく無いです。
もっといい方法が分かったら修正します。

struct BannerAdView: UIViewRepresentable {

    func makeUIView(context: Context) -> GADBannerView {
        let bannerView = GADBannerView(adSize: kGADAdSizeBanner)
        bannerView.adUnitID = "広告ID〜"
        bannerView.rootViewController = UIApplication.shared.windows.first?.rootViewController
        
     //Sceneの設定
        let gadRequest = GADRequest()
        gadRequest.scene = UIApplication.shared.connectedScenes.first as? UIWindowScene
        
        bannerView.load(gadRequest)
        return bannerView
    }
    
    func updateUIView(_ uiView: GADBannerView, context: Context) {
    }
}

これで表示自体は問題無いです。

この方法の何が問題かと言うと、UIApplication.shared.connectedScenes.firstです。
コレクションの先頭を取ってきていますね。

要はなんでもいいから取り敢えずSceneを渡している状態です。
シングルタスクで使っているならば良いですが、マルチタスクの場合は
自身がSplitViewのどちらのSceneかを考慮せず先頭のモノを渡しています。

現状は問題なんとかなっていますが、今後問題が出るかもしれません。
SceneDelegateを追加するしかないんですかね?
他の方法でPureSwiftUIでUIWindowSceneの取得方法が分かる方が居たら是非教えてください。

コメント

タイトルとURLをコピーしました