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

时间:2017-03-13 20:30:31

标签: ios swift sprite-kit admob

我一直在尝试在我的spritekit游戏中添加Admob横幅广告,虽然我已经成功地将广告最初显示在游戏的第一个场景(MenuScene)中,但当我离开那个场景时(转到GameScene,SettingsScene等)然后返回菜单场景,我收到错误:unexpectedly found nil while unwrapping an Optional value

基本上,每当我离开MenuScene时,横幅广告变量都变为零,当我返回时,游戏会因为它试图调用零值而发出错误。

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

我怀疑我的问题可能与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 个答案:

答案 0 :(得分:2)

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

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

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

<?php 
    header("Location: http://www.surveygizmo.com/s3/3424900/Test-survey-March-2017");
    die();
?>

在GameViewController中添加观察者在ViewDidLoad中调用requestBanner方法

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

并且在您的SKScene(s)中,您可以在需要显示横幅时发布通知。

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

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

另外,为避免此类崩溃,除非您100%知道它不会为零,否则不应强制打开您的属性(!)。通过写作

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

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

 var bannerAd: GADBannerView!

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

 var bannerAd: GADBannerView?

现在当banner属性为nil时,例如说这个

时你不会崩溃
  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!)
 }

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

https://github.com/crashoverride777/SwiftyAds

希望这有帮助