【问题标题】:How to call admob interstitial ad using swift, spritekit and xcode?如何使用 swift、spritekit 和 xcode 调用 admob 插页式广告?
【发布时间】:2015-04-24 03:35:00
【问题描述】:

我一直在寻找这个问题的答案,我在 Objective C 中找到了很多示例(谷歌开发者文档等),并在 swift 中找到了一些答案,但没有使用 spritekit,并且是一个新手,我只是无法弥合这些教程中的空白,以便将它们全部放在我的项目中。老实说,我并不关心广告是在应用启动时还是游戏结束时调用的,我很高兴能够调用广告期,尽管我想在游戏启动时是首选。

很确定我已经在 gameviewcontroller.swift 中正确设置了它,但我不知道如何实际调用它。这是我的 gameviewcontroller.swift 中的代码:

import UIKit
import SpriteKit
import GoogleMobileAds

class GameViewController: UIViewController {

    var interstitial : GADInterstitial!

 func createAndLoadAd() -> GADInterstitial {

        var ad = GADInterstitial()
        ad.adUnitID = "ca-app-pub-4471013071748494/2980967718"
        var request = GADRequest()
        request.testDevices = [""]

        return ad

    }

除此之外......我还有这个 if 语句来调用广告,但我不知道它应该在哪里......或者它是否完整(在教程中,它在一个按钮中,但我需要它是自动的,自然:

if (self.interstitial.isReady) {
            self.interstitial.presentFromRootViewController(self)
            self.interstitial = self.createAndLoadAd()
        }

有人有这方面的经验吗?如果有人可以通过让我知道在 if 语句上方放置该语句的位置来帮助我完成此操作,或者是否还有更多工作需要完成……您的帮助将不胜感激。谢谢你。

【问题讨论】:

  • 我认为,当您展示它时,您会通过再次调用 create 方法来杀死它 - 您应该在您的广告被驳回时调用该方法。我可能错了,但对我来说,唯一的区别是我是 obj-c
  • 这 if dstatement 是实际调用广告的内容。把它放在你想让广告弹出的任何地方,让我们说在游戏结束或 viewDidLoad 这取决于你
  • 最好在游戏结束时调用它,因为广告必须加载(需要时间取决于连接速度)
  • 顺便说一句,您的代码中缺少广告的加载请求方法
  • 谢谢...但我不太明白您在第一个和最后一个 cmets 中所说的内容。不确定当我展示它时我是否会杀死它......上面的代码直接来自将广告放在按钮中的教程,老兄按下按钮并且它起作用了。我只希望它是自动的或基于事件的,而不是基于按钮的。但是,这是在我的 gameviewcontroller.swift 上......我如何从 gamescene.swift 或 gameend.swift (创建游戏视觉方面的两个 swift 文件)调用它?您能否提供一些示例代码??

标签: ios xcode swift admob interstitial


【解决方案1】:

好的,所以我开始了一个新项目(Swift 项目),即 Game Project

在 GameViewController 中:

class GameViewController: UIViewController
{
var interstitial = GADInterstitial()

override func viewDidLoad()
{
    super.viewDidLoad()

    if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene
    {
        // Configure the view.
        let skView = self.view as! SKView
        skView.showsFPS = true
        skView.showsNodeCount = true

        /* Sprite Kit applies additional optimizations to improve rendering performance */
        skView.ignoresSiblingOrder = true

        /* Set the scale mode to scale to fit the window */
        scene.scaleMode = .AspectFill

        skView.presentScene(scene)



        let delayTime = dispatch_time(DISPATCH_TIME_NOW,
            Int64(5 * Double(NSEC_PER_SEC)))

        //Creation of the ad and its request
        self.interstitial = GADInterstitial()
        self.interstitial.adUnitID = "ca-app-pub-4798156420380453/7714267723"
        var request = GADRequest()
        // request.testDevices = [""]
        self.interstitial.loadRequest(GADRequest());//The method u were missing

        dispatch_after(delayTime, dispatch_get_main_queue())
        {
            self.showAd()
        }

    }
}



 func showAd()
 {
    if (self.interstitial.isReady)
    {
        self.interstitial.presentFromRootViewController(self)//Whatever  shows the ad
    }
}

这是我的第一个 swift 代码,所以不要评判我是否做错了什么 但是当我在±5秒后吃午饭时,我看到了广告 这是你的例子。

我对 Swift 一点也不熟悉, 但是您需要做的就是在解散时获取插页式代表 -> 并请求下一个插页式,因此下次您将获得新的广告

随便问什么! 附言不要忘记将 admob ID 更改为您的 ID。

【讨论】:

  • 太棒了!!太棒了,谢谢你!!!得到它的工作。很抱歉长时间延迟回复,在回复之前不得不投入一些家庭时间。这太棒了。调度工作做得很好。优秀!现在我可以玩这个了,看看可能只是让它在游戏屏幕上显示或其他什么......但我不会再麻烦你了,你肯定已经超越了。谢谢你 x10^123!!!
  • 嗯,好吧,一直坐在这里尝试不同的事情,“随便问什么”这句话一直在我脑海中浮现。所以......我想我会问(随意忽略,公平吗?)......如果你想在场景变化而不是在 delayTime 之后调用 add ,你会有什么不同?当玩家死亡时,这个应用程序会从游戏场景转到结尾场景……如果在加载完结尾场景时广告就出现了,那就太棒了。有什么想法吗?无论哪种方式都不要担心 - 说真的,随意忽略,我会坚持下去。 :-)
  • 那么在 obj-c 中,方法是将 showAd 方法从 endScene 委托给 viewController(也可以使用 nsnotification center)在 swift 中应该是相同的,只是 Idk 如何声明它的语法,我会试着去网上查一下
  • 这里是通知中心示例andrewcbancroft.com/2014/10/08/…
【解决方案2】:

我基于上述 cmets 的解决方案如下:

1) 在 GameViewController.swift 中添加这个

protocol AdmobInterstitialDelegate{
    func showInterstitial()
}
...
// add this delegate in GameViewController definition
class GameViewController: UIViewController, GADInterstitialDelegate, AdmobInterstitialDelegate {
...
// and assign it to the GameScene class when you create its instance
     let scene = GameScene()
     scene.adDelegate = self
// do not forget to implement the delegated method itself
    func showInterstitial(){
        if (interstitial!.isReady) {
            interstitial!.presentFromRootViewController(self)             
        }
    }

然后你就可以在GameScene中使用了

class GameScene: SKScene {
....
    var adDelegate: AdmobInterstitialDelegate?
....
// and finally - show the ad
    override func didMoveToView(view: SKView) {
        self.adDelegate?.showInterstitial();
        ....

希望这会有所帮助。

【讨论】:

  • 这会根据正在显示的场景显示广告吗?
【解决方案3】:

在 viewDidAppear 中保留 if 条件,它会自动执行

override func viewDidAppear(animated: Bool) {
        if (interstitial.isReady) {
        interstitial.presentFromRootViewController(self)
        self.interstitial = self.createAndLoadInterstitial()
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多