Swift Admob初始错误



这很长,但可能是一个非常容易的修复 大部分都是代码,只需跳到底部,就会有一个tl;dr

嘿,所以我已经学习了大约10个教程,让Admob有趣的东西在我的Swift Spritekit游戏中发挥作用。除了我看过的所有教程都使用带按钮的IBAction。目前,我希望广告每隔一段时间就会出现在菜单上。(首先,我可能稍后会更改它)。这一切都很完美,但一旦我按下播放按钮(转到另一个场景),然后返回菜单场景。(游戏场景)间隙功能不再发生。没有错误,只是在应用程序完全关闭并重新打开之前,它不会再这样做了。

这是代码。

在我的GameViewController类中,我有:

var interstital: GADInterstitial!

在GameViewController中确实加载了我的:

if let scene = GameScene(fileNamed:"GameScene") {
let skView = self.view as? SKView
skView!.ignoresSiblingOrder = false
scene.scaleMode = .AspectFill
scene.viewController = self
skView!.presentScene(scene)
interstital = GADInterstitial(adUnitID: "ca-app-pub-9776687746813194/9687097060")
let request = GADRequest()
interstital.loadRequest(request)

同样在GameViewController类中,我有以下功能:

func ShowAd() {
print("doing the showadfunc now")
if (interstital.isReady) {
print("there is an inter ready")
interstital.presentFromRootViewController(self)
interstital = CreateAd()
}
else{
print("The interstitial wasn't ready.")
}
}
func CreateAd() -> GADInterstitial {
let interstital = GADInterstitial(adUnitID: "ca-app-pub-9776687748683194/9687247060")
interstital.loadRequest(GADRequest())
return interstital
}

在我的GameScene(菜单)类中,我有:

var viewController: GameViewController!

在我的GameScene类中,我有这个显示间隙广告的功能。

func adThing(){
//viewController?.ShowAd()
print("starting the ad function")
let waitForInterstitial = SKAction.waitForDuration(15.0)
let waitForInterstitialShort = SKAction.waitForDuration(3.0)
let showInterstitialAd = SKAction.runBlock({self.viewController?.ShowAd(); print("the function has been called..")})
let waitThenShowInterstitial = SKAction.sequence([showInterstitialAd,waitForInterstitial])
let waitThenShowInterStitialForever = SKAction.repeatActionForever(waitThenShowInterstitial)
//self.runAction(waitThenShowInterStitialForever)
self.runAction(waitForInterstitialShort, completion: {
print("its waited 3 seconds and will now start the ad thingo")
self.runAction(waitThenShowInterStitialForever)
})
print("done")
}

因此,我每20秒调用一次GameScene中的ShowAd函数(位于gameviewcontroller中),(我已经确认它至少认为它在调用该函数。)当应用程序一开始就打开时,它可以完美地工作。但是,当我更改场景,然后返回菜单场景(GameScene)时,我的GameScene函数中的打印不断发生,我的代码认为正在调用ShowAd函数,但似乎什么都没有发生,没有弹出任何间隙,甚至GameViewController中ShowAd功能中的打印也没有。

所以,在我换了场景并返回后,我的游戏似乎忘记了GameViewController是什么。如果我指的是没有"?"的GameViewController它会导致我的游戏崩溃,错误为"打开可选时意外发现nil"。所以在更改场景后,GameViewController可能会变成nil?我该怎么解决这个问题。

请帮帮我!!!(我是编程新手,以防你说不出来。我知道对我的代码发表刻薄的评论一定很诱人,因为它真的很肤浅,目前还不太好。)

非常感谢你,如果你能帮助我,哇。。感谢阅读所有这些..;)

您的问题很可能是,一旦转换到新场景,viewController属性将设置为nil,因此如果使用!,则会崩溃!。

通常,在您的SKScenes中引用viewController不是最佳做法,您应该使用委派或NSNotification Center。

1) 通知中心(最简单的方法)

在您具有显示广告功能的ViewController中,在ViewDidLoad 中添加NSNotificationCenter观察器

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(showAd), name: "ShowInterAdKey", object: nil)

(Selector是要调用的函数,name是引用该观察者的关键)

在你的SKScenes中,当你想显示广告时,你只需发布通知

NSNotificationCenter.defaultCenter().postNotificationName("ShowInterAdKey", object: nil)

2) 有关委派示例,请查看以下文章。

http://stephenradford.me/creating-a-delegate-in-swift/

https://www.natashatherobot.com/ios-weak-delegates-swift/

3) 我还注意到,你在显示广告之前没有预先加载广告,这不是很有效,可能会导致广告显示延迟。

你应该打电话给

interstital = CreateAd()

在viewDidLoad中,因此它将尽快加载第一个广告。比你应该使用adMob委托方法

func interstitialDidDismissScreen(ad: GADInterstitial!) {
// load next ad
interstital = CreateAd()

以在当前广告关闭后立即加载下一个广告。

要使用代理,您可以在ViewController 中创建扩展

extension MyViewController: GADInterstitialDelegate {
func interstitialDidReceiveAd(ad: GADInterstitial!) {
print("AdMob interstitial did receive ad from: (ad.adNetworkClassName)")
}
func interstitialWillPresentScreen(ad: GADInterstitial!) {
print("AdMob interstitial will present")
// pause game/app
}
func interstitialWillDismissScreen(ad: GADInterstitial!) {
print("AdMob interstitial about to be closed")
}
func interstitialDidDismissScreen(ad: GADInterstitial!) {
print("AdMob interstitial closed, reloading...")
interstitial = createAd()
}
func interstitialWillLeaveApplication(ad: GADInterstitial!) {
print("AdMob interstitial will leave application")
// pause game/app
}
func interstitialDidFailToPresentScreen(ad: GADInterstitial!) {
print("AdMob interstitial did fail to present")
}
func interstitial(ad: GADInterstitial!, didFailToReceiveAdWithError error: GADRequestError!) {
print(error.localizedDescription)
}
}

为了确保这些被调用,请转到您的createAd函数并在返回广告之前添加此行

let interstitial = ...
interstitial.delegate = self

最后,你的showAd方法应该看起来像这个

func showAd() {
print("doing the showadfunc now")
if (interstital.isReady) {
print("there is an inter ready")
interstital.presentFromRootViewController(self)
} else{
print("The interstitial wasn't ready, reloading again.")
interstital = CreateAd()
}
}

4) 如果你正在寻找一个更可重复使用的解决方案,你也可以在gitHub上查看我的助手。

https://github.com/crashoverride777/Swift-AdMob-AppLovinTVOS-CustomAds-Helpers

作为一般提示,您还应该遵循swift命名约定,您的函数和属性应该以小写字母开头。只有类、结构、枚举和协议应该以大写字母开头。它使您的代码更难自己阅读,也更难在stackoverflow上阅读,因为它被标记为蓝色,但不应该。你有时在做,有时不在。

希望这能帮助

我敢打赌这是你的问题:

if (interstital.isReady) {
print("there is an inter ready")
interstital.presentFromRootViewController(self)
interstital = CreateAd()

您正在呈现间隙,然后立即覆盖您的interstitial。您应该实现GADInterstitial的委托方法,并在调用func interstitialDidDismissScreen(ad: GADInterstitial!)后调用func CreateAd() -> GADInterstitial

如果您的设备因以下原因而不断崩溃:

interstitial.delegate = self

然后把它放在你的CreatAndLoadInterinitial()中,而不是你的viewDidLoad()中

相关内容

  • 没有找到相关文章

最新更新