首页 文章

在SpriteKit中切换场景时,Admob Banner广告变为零

提问于
浏览
1

我已经成功地让广告最初出现在游戏的第一个场景(MenuScene)中,当我离开那个场景(去GameScene,SettingsScene等)然后回到菜单场景时,我得到了错误: unexpectedly found nil while unwrapping an Optional value

基本上,每当我离开MenuScene时, Banner 广告变量都变为零,当我返回时,游戏会因为尝试调用零值而出错 .

我已经尝试在GameViewController,MenuScene和SettingsScene中初始化 Banner 广告(GameViewController中保留的方法只是在后两个选项中的MenuScene或SettingsScene中调用) - Banner 广告在离开菜单场景时总是成为,到达设置场景时没有 .

我怀疑我的问题可能与GameViewController只与MenuScene直接相关这一事实有关,当玩家从MenuScene转移(因此也离开GameViewController)到另一个场景时,GameViewController中的所有变量变得零 . 但是,我不知道该怎么做,并希望在这方面提供一些帮助 . 这是我的初始化代码:

在GameViewController中:

var bannerAd: GADBannerView!

func initializeBanner() {
    bannerAd = GADBannerView(adSize: kGADAdSizeSmartBannerLandscape, origin: CGPoint(x: 0, y: self.view.frame.size.height-32))
    bannerAd.isHidden = true
    bannerAd.adUnitID = "ca-app-pub-3940256099942544/2934735716"
    bannerAd.rootViewController = self
    view.addSubview(bannerAd)
}

func requestBanner() {
    let request = GADRequest()
    request.testDevices = ["31340db3ea728bd5faf2789325b27620"]
    bannerAd.load(request)
}

在MenuScene中:

var gameVC: GameViewController!

override func didMove(to view: SKView) {
    gameVC.initializeBanner()
    gameVC.requestBanner()
    gameVC.bannerAd.isHidden = false
}

转换到(例如)SettingsScene时:

gameVC.bannerAd.isHidden = true

1 回答

  • 2

    正如您所提到的,当您更改场景时,您将放弃对GameViewController的引用 . 一般来说,这不是在SKScenes中引用GameViewController的最佳实践 .

    调用GameViewController方法的更好方法是使用通知中心或委托 .

    为通知创建密钥以避免拼写错误 . 您可以将它放在项目中的任何位置(任何类或新的.swift文件之外)

    extension Notification.Name {
        static let showBannerAd = Notification.Name(rawValue: "ShowBanner")
     }
    

    比你的GameViewController在ViewDidLoad中添加观察者来调用requestBanner方法

    NotificationCenter.default.addObserver(self, selector: #selector(requestBanner), name: .showBannerAd, object: nil) // selector is the method to call
    

    而在您的SKScene中,您可以在需要显示 Banner 时发布通知 .

    NotificationCenter.default.postNotificationName(.showBannerAd, object: nil)
    

    How to present ads during certain scenes in sprite-kit?

    另外,为了避免这种崩溃你不应该强制打开你的属性(!),除非你100%知道它不会是零 . 通过写作

    var bannerAd: GADBannerView!
    

    你告诉xCode这个 Banner 属性将永远存在,永远不会是零 . 这不是案例,因此使您的代码不那么稳固 . 所以你应该把它变成像这样的可选属性

    var bannerAd: GADBannerView?
    

    而不是像你这样的设置方法

    func initializeBanner() {
           bannerAd = GADBannerView(adSize: kGADAdSizeSmartBannerLandscape, origin: CGPoint(x: 0, y: self.view.frame.size.height-32))
           bannerAd?.isHidden = true
           bannerAd?.adUnitID = "ca-app-pub-3940256099942544/2934735716"
           bannerAd?.rootViewController = self
           view.addSubview(bannerAd!)
     }
    

    现在,当banner属性为nil时,例如说这个就不会崩溃

    bannerAd?.isHidden = true
    

    或者我在Github上有一个帮手,这将使这更容易和更清洁 .

    https://github.com/crashoverride777/SwiftyAds

    希望这可以帮助

相关问题