0

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

4

0 回答 0