对我刚刚偶然发现的一个问题感到非常困惑。我有一个 swift 游戏,主要使用 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 展示广告,同时也过渡到新场景。