はじめに
今回の問題はシュミレーターのみで発生します。
実機テストやリリースアプリでは発生しない問題なのでエラーが気にならない方はスルーでいいと思います。
私は気になったので対応しました
エラー
<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.
解決方法
バナー広告の場合
バナー広告の表示方法解説はこちら
import SwiftUI
import GoogleMobileAds
struct BannerView: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> UIViewController {
let viewController = GADBannerViewController()
return viewController
}
func updateUIViewController(_ uiViewController: UIViewController, context: Context) {
}
}
class GADBannerViewController: UIViewController, GADBannerViewDelegate {
var bannerView: GADBannerView!
let adUnitID = "ca-app-pub-3940256099942544/2934735716"
override func viewDidLoad() {
super.viewDidLoad()
bannerView = GADBannerView(adSize: GADAdSizeBanner)
bannerView.adUnitID = adUnitID
bannerView.rootViewController = self
+ let request = GADRequest()
+ request.scene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene
+ bannerView.load(request)
- bannerView.load(GADRequest())
bannerView.delegate = self
setAdView(bannerView)
}
func setAdView(_ view: GADBannerView) {
bannerView = view
self.view.addSubview(bannerView)
bannerView.translatesAutoresizingMaskIntoConstraints = false
let viewDictionary = ["_bannerView": bannerView!]
self.view.addConstraints(
NSLayoutConstraint.constraints(
withVisualFormat: "H:|[_bannerView]|",
options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: viewDictionary)
)
self.view.addConstraints(
NSLayoutConstraint.constraints(
withVisualFormat: "V:|[_bannerView]|",
options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: viewDictionary)
)
}
func bannerViewDidReceiveAd(_ bannerView: GADBannerView) {
print("🍎: バナー広告を受信しました")
}
func bannerView(_ bannerView: GADBannerView, didFailToReceiveAdWithError error: Error) {
print("😭: バナー広告の受信に失敗しました → \(error.localizedDescription)")
}
func bannerViewDidRecordImpression(_ bannerView: GADBannerView) {
print("🍌: バナー広告を表示しました")
}
}
リワード広告の場合
リワード広告の表示方法解説はこちら
import GoogleMobileAds
class Reward: NSObject, GADFullScreenContentDelegate, ObservableObject {
@Published var rewardLoaded: Bool = false
var rewardedAd: GADRewardedAd?
override init() {
super.init()
}
// リワード広告の読み込み
func LoadReward() {
+ let request = GADRequest()
+ request.scene = UIApplication.shared.connectedScenes.first as? UIWindowScene
+ GADRewardedAd.load(withAdUnitID: "ca-app-pub-3940256099942544/1712485313", request: request) { (ad, error) in
- GADRewardedAd.load(withAdUnitID: "ca-app-pub-3940256099942544/1712485313", request: GADRequest()) { (ad, error) in
if let _ = error {
print("😭: 読み込みに失敗しました")
self.rewardLoaded = false
return
}
print("😍: 読み込みに成功しました")
self.rewardLoaded = true
self.rewardedAd = ad
self.rewardedAd?.fullScreenContentDelegate = self
}
}
// リワード広告の表示
func ShowReward() {
let root = UIApplication.shared.windows.first?.rootViewController
if let ad = rewardedAd {
ad.present(fromRootViewController: root!, userDidEarnRewardHandler: {
print("😍: 報酬を獲得しました")
self.rewardLoaded = false
})
} else {
print("😭: 広告の準備ができていませんでした")
self.rewardLoaded = false
self.LoadReward()
}
}
}
インタースティシャル広告の場合
インタースティシャル広告の表示方法解説はこちら
import GoogleMobileAds
class Interstitial: NSObject, GADFullScreenContentDelegate, ObservableObject {
@Published var interstitialAdLoaded: Bool = false
var InterstitialAd: GADInterstitialAd?
override init() {
super.init()
}
// リワード広告の読み込み
func LoadInterstitial() {
+ let request = GADRequest()
+ request.scene = UIApplication.shared.connectedScenes.first as? UIWindowScene
+ GADInterstitialAd.load(withAdUnitID: "ca-app-pub-3940256099942544/4411468910", request: request) { (ad, error) in
- GADInterstitialAd.load(withAdUnitID: "ca-app-pub-3940256099942544/4411468910", request: GADRequest()) { (ad, error) in
if let _ = error {
print("😭: 読み込みに失敗しました")
self.interstitialAdLoaded = false
return
}
print("😍: 読み込みに成功しました")
self.interstitialAdLoaded = true
self.InterstitialAd = ad
self.InterstitialAd?.fullScreenContentDelegate = self
}
}
// インタースティシャル広告の表示
func ShowInterstitial() {
let root = UIApplication.shared.windows.first?.rootViewController
if let ad = InterstitialAd {
ad.present(fromRootViewController: root!)
self.interstitialAdLoaded = false
} else {
print("😭: 広告の準備ができていませんでした")
self.interstitialAdLoaded = false
self.LoadInterstitial()
}
}
// 失敗通知
func ad(_ ad: GADFullScreenPresentingAd, didFailToPresentFullScreenContentWithError error: Error) {
print("インタースティシャル広告の表示に失敗しました")
self.interstitialAdLoaded = false
self.LoadInterstitial()
}
// 表示通知
func adWillPresentFullScreenContent(_ ad: GADFullScreenPresentingAd) {
print("インタースティシャル広告を表示しました")
self.interstitialAdLoaded = false
}
// クローズ通知
func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
print("インタースティシャル広告を閉じました")
self.interstitialAdLoaded = false
}
}
参考にしたサイト