当前位置: 首页 > 知识库问答 >
问题:

Swift Admob间隙错误

华坚成
2023-03-14

这相当长,但可能是一个非常容易修复的问题。大部分都是代码,只需跳到底部,就会有一个tl;博士

嘿,所以我已经遵循了大约10个关于让Admob间质在我的Swift Spritekit游戏中工作的教程。除了我看到的所有教程都使用带有按钮的IBAction。目前,我希望广告每隔一段时间在菜单上弹出一次。(只是为了开始,我可能会在以后更改它)。这一切都非常完美,但是一旦我点击播放按钮(进入不同的场景),然后返回菜单场景。(GameScene)间质功能不再发生。没有错误,它只是在应用程序完全关闭并重新打开之前不再这样做。

这是代码。

在我的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

}

在我的游戏场景(菜单)类中,我有:

var viewController: GameViewController!

在我的游戏场景类中,我有一个显示中间广告的功能。

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秒在游戏场景中调用ShowAd函数(位于gameviewcontroller中)(我已经确认它至少认为它正在调用该函数。)当应用程序一开始就打开时,它可以完美地工作。但当我改变场景,然后返回到菜单场景(GameSecene)时,GameSecene函数中的打印不断发生,我的代码认为它正在调用ShowAd函数,但似乎什么都没有发生,没有出现间隙,甚至连GameViewController中ShowAd函数中的打印都没有。

因此,似乎在我更改场景并返回后,我的游戏忘记了GameViewController是什么。如果我引用不带“?”的GameViewController它将使我的游戏崩溃,错误为“在打开可选包装时意外发现零”所以在更换场景后,GameViewController可能会变为零?我怎样才能解决这个问题。

请帮帮我!!!(我是编程新手,以防你不知道。我知道对我的代码发表卑鄙的评论一定很诱人,它真的很简单,目前还不太好。)

谢谢你这么多,如果你能帮助我,哇...谢谢阅读这一切...;)

共有3个答案

时修贤
2023-03-14

如果您的设备因以下原因持续崩溃:

interstitial.delegate = self

然后将其放入CreatandLoadInterstitual(),而不是viewDidLoad()

汪思博
2023-03-14

我敢打赌这是你的问题:

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

您正在呈现您的间隙,然后立即覆盖您的间隙。您应该实现GADInterstiular的委托方法并调用您的func CreateAd()-

须鸿祯
2023-03-14

你的问题很可能是,一旦你过渡到一个新场景,viewController属性设置为零,因此如果你使用!。

一般来说,在SKScenes中引用viewController不是最佳实践,您应该使用委托或NS通知中心。

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函数并在返回ad之前添加此行

 let interstitial = ...
 interstitial.delegate = self

最后,您的show Ad方法应该如下所示

  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命名约定,您的func和属性应该以小写字母开头。只有类、结构、枚举和协议应该以大写字母开头。这会使您的代码更难为自己和在stackoverflow上阅读,因为它被标记为蓝色,但不应该。您有时在做,有时没有。

希望这有帮助

 类似资料:
  • 在AdMob中,当我调用插屏广告时,日志会得到“请求错误:不会发送请求,因为已使用间隙对象”。 我怎样才能修复它? 我的代码是:

  • AndroidLollipop5.0.1 内核版本:3.10.53 i.MX6 双核 你好, 我在系统服务器中做了一些更改,并构建了一个API供客户的应用程序使用,但当我尝试构建SDK以允许我在Android Studio中测试更改后的API时,它失败了,并出现了标题中的错误(调试如下)。 这是我的过程: > 做了我的服务和各自的经理。 运行“make update-api” 按照以下说明操作:

  • 下面的代码生成九个单独的JPanels,其中有9个按钮。九个JPanel使用GridLayout排列到一个基本JPanel上。然后使用边框布局将这个基本JPanel放置到ContentPane上。我对JButtons和每个JPanel使用边框来明确定义它们的分离。每个JPanel中的JButtons看起来都很好,但是JPanels之间有一个间隙,这导致了双行的出现,这让我非常恼火。我尝试将每个JP

  • 我正在尝试在ios上实施Admob插播广告。 这是我到目前为止所拥有的,这是我第一次接触目标-c,所以请善良。 在玩家死亡并单击重新启动按钮后,我在游戏中调用ShowAd()。目前,\u interstitalad。isReady不会像真的那样回来。 这是我开始使用的文档https://developers.google.com/mobile-ads-sdk/docs/admob/advanced

  • 我正在我的项目中实施间隙IAD。每场比赛后,我都会尝试显示一个中间广告。然而,在我的测试中,我得到一个错误,即大约10场比赛后,中间广告太多了。如何删除这些插入式广告? 代码: 此外,我还试图在每次比赛结束后播放一则插播广告。然而,有时没有显示广告,我认为这是正常的,因为广告库存可能并不总是可用的。因此,游戏通常在结束时不显示广告。 是否有一种方法,我可以检测到是否不会显示间隙广告,以便我可以使用

  • 嗨,伙计们,我的广告插页有问题。我在主活动中有一个横幅,但在另一个活动中,我想显示一个插页广告。横幅可以。。。我能看到这个!但间隙并没有显示。。。这是我的代码: } 我的UnitID是正确的:有一个logcat。 我在4.4.2中使用了模拟器,但我在物理设备上进行了尝试,但没有在中间位置使用广告,但在主活动中使用了小横幅! 我有GooglePlayService库...我的应用程序使用google