【AdMob】iPadでバナー広告が表示されない問題の解決方法!
この記事からわかること
- AdMobのバナー広告がiPadで表示できない場合の解決方法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Swiftで作成したiOSアプリに導入しているAdMobのバナー広告がiPadではなぜか表示することができませんでした。今回はその解決方法をまとめていきます。
iPadでバナー広告が再生されない問題の解決方法
iOSアプリへのバナー広告の詳細な導入方法については以下の記事を参考にしてください。
おすすめ記事:【Swift UI】AdMobのバナー広告の実装方法!
私が実際にバナー広告が表示できなくなっていたのは以下のコードで実装していた場合です。iPhoneでは正常に動作しましたが、iPadでは表示されませんでした。
import SwiftUI
import UIKit // こちらも必要
import GoogleMobileAds // 忘れずに
struct AdMobBannerView: UIViewRepresentable {
func makeUIView(context: Context) -> GADBannerView {
let banner = GADBannerView(adSize: GADAdSizeBanner) // インスタンスを生成
// 諸々の設定をしていく
banner.adUnitID = "ca-app-pub-xxxxxxxxxxxxxxxxx/xxxxxxxx" // 自身の広告IDに置き換える
banner.rootViewController = UIApplication.shared.windows.first?.rootViewController
banner.load(GADRequest())
return banner // 最終的にインスタンスを返す
}
func updateUIView(_ uiView: GADBannerView, context: Context) {
// 特にないのでメソッドだけ用意
}
}
今回修正すべきポイントとなるのはload
メソッドの引数に渡す、広告リクエストを送るためのGADRequest
インスタンスです。
loadメソッドの定義
class func load(withAdUnitID adUnitID: String, request: GADRequest?) async throws -> GADRewardedAd
iPadでは明示的に表示するシーンの指定が必要
iPadはiPhoneの時とは少し異なった動作をすることが多いです。NavigationView
では明示的にstack
を指定しないと見た目が崩れてしまったり、シェアボタンを実装するためのUIActivityViewController
がクラッシュしてしまったりと何かと厄介な存在です。
今回の問題もシェアボタンの時の原因:「ポップオーバー画面を表示させる際はビューと表示位置を明示的に指定する必要がある」と近しいものかなと思います。
なのでUIApplication
クラスのconnectedScenes
プロパティからメモリ内でアクティブになっているシーンを取得し明示的にシーンを指定することで解決できました。
解決したコード
struct AdMobBannerView: UIViewRepresentable {
func makeUIView(context: Context) -> GADBannerView {
let banner = GADBannerView(adSize: GADAdSizeBanner) // インスタンスを生成
// 諸々の設定をしていく
banner.adUnitID = "ca-app-pub-3940256099942544/2934735716" // 自身の広告IDに置き換える
let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene
banner.rootViewController = windowScene?.windows.first!.rootViewController
// 追加
let request = GADRequest()
request.scene = UIApplication.shared.connectedScenes.first as? UIWindowScene
// 追加
banner.load(request) // 変更
return banner // 最終的にインスタンスを返す
}
func updateUIView(_ uiView: GADBannerView, context: Context) {
// 特にないのでメソッドだけ用意
}
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。
私がSwift UI学習に使用した参考書