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の取得方法が分かる方が居たら是非教えてください。
コメント