偶然見つけた問題について非常に混乱しています。主にSpriteKitを使用して、迅速なゲームをしています。ゲームの最後に広告が読み込まれます。または、ユーザーがゲームを終了することを決定すると、広告も読み込まれます。
ゲームが正常にプレイされている場合。流れは以下の通り…
MenuScene -> GameScene -> [広告読み込み] -> GameOverScene
ユーザーがゲームを終了した場合...
MenuScene -> GameScene -> ユーザーが一時停止を選択 -> ユーザーが終了をクリック -> [広告読み込み] -> メニュー シーン
どちらのシナリオも iOS 13 で完全に機能します
ただし、iOS 12 では、ゲームの途中で終了したユーザーのみが機能し、他のシナリオではアプリがフリーズします (ログに明らかなエラーはありません)。
いずれかの方法でゲームを終了すると、まったく同じ関数が呼び出されます。通知を使用して広告を読み込みます。
次のコードはすべて GameViewController にあります。そして、通知は GameScene に投稿されます。
NotificationCenter.default.addObserver(self, selector: #selector(GameViewController.showAd), name: NSNotification.Name(rawValue: "loadAndShow"), object: nil)
ViewDidLoad()で広告を用意
myAd = createAd()
そして、関数は通知によって呼び出されます
@objc func showAd() {
if (myAd.isReady) {
myAd.present(fromRootViewController: self)
myAd = createAd()
}
}
func createAd() -> GADInterstitial {
myAd = GADInterstitial(adUnitID: "MY ADMOB ID")
let request = GADRequest()
GADMobileAds.sharedInstance().requestConfiguration.testDeviceIdentifiers = ["MY DEVICE ID"]
myAd.delegate = self
myAd.load(request)
return myAd
}
どんな助けでも素晴らしいでしょう
アップデート
潜在的な回避策を見つけました。現在、別のスレッドで広告を表示していますが、フリーズは発生していません。
DispatchQueue.main.async {
self.myAd.present(fromRootViewController: self)
}
iOS13の方がこれに対する処理が優れているとしか思えません。そして、「ゲーム終了」シナリオが機能した理由は、GameViewController でもあるメニュー シーンに遷移していたためです。このアプリは、GameViewController から広告を表示しながら新しいシーンに移行することを好みませんでした。