在 iOS 游戏应用和 Swift 中使用 AdMob 插页式广告

Using AdMob interstitial ads in iOS game applications and Swift

好的,我已经花了好几天时间来做这件事。我已经浏览了 admob 的教程、youtube、stack exchange 等所有内容,但我找不到解决问题的方法。

我正在尝试将 admob 的插页式广告实施到我的 iOS 游戏应用程序中。代码编译、构建、运行,游戏开始运行,但广告不会出现。这是我的 GameViewController.swift

import UIKit
import SpriteKit
import GoogleMobileAds


class GameViewController: UIViewController, GADInterstitialDelegate {

//AD STUFF-----------------------------vBELOWv----------------------------------------------
//AD STUFF-----------------------------vBELOWv----------------------------------------------
var interstitialAd: GADInterstitial?

func createInterstitialAd() -> GADInterstitial {
    let request = GADRequest()
    let interstitial = GADInterstitial(adUnitID: "ca-app-pub-******")
    request.testDevices = [kGADSimulatorID, "C966DEAC-A2FD-4FBA-80B5-802B7E394C6D", "F3E1897A-3556-4704-9C85-3D70B4672F44","090DCEE5-6B1C-4DFB-83CE-FE800A242008", "1B93E43B-E9B3-4482-8B11-4F3614A26EA2"]
    interstitial.delegate = self
    interstitial.loadRequest(request)

    return interstitial
}

//func to show the ad
func showAd() {
    if interstitialAd != nil {
        if interstitialAd!.isReady{
            interstitialAd?.presentFromRootViewController(self)
        }
        else {print("found not ready")}
    }
}

//func to pre-load new ad - calls automatically when closes an ad
func interstitialWillDismissScreen(ad: GADInterstitial!) {
    interstitialAd = createInterstitialAd()

}
//AD STUFF--------------------------^ABOVE^--------------------------------------------------
//AD STUFF--------------------------^ABOVE^--------------------------------------------------

override func viewDidLoad() {
    super.viewDidLoad()
    interstitialAd = createInterstitialAd()
    if let scene = GameScene(fileNamed:"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
        scene.size = self.view.bounds.size
        skView.presentScene(scene)
    }
}

这就是我在 GameScene 中调用它的方式

//makes the restart button appear
func createRestartBTN(){
    restartBTN = SKSpriteNode(color: SKColor.clearColor(), size: CGSize(width: 200, height: 100))
    restartBTN.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame))
    restartBTN.zPosition = 10

    addChild(restartBTN)
    createReplayText()
    varForGVC.showAd()
}

所以当游戏结束时,一个函数使重新启动按钮出现。然后我想让我的插页式广告弹出,这样用户必须退出插页式广告才能点击重播按钮。该变量 varForGVC 是由 varForGVC = GameViewController()

在 GameScene.swift 中较早实现的

我已将我的应用程序与 Firebase 和 admob 同步。我的根目录中有 GoogleService-Info.plist。我的根目录中也有 admob 所需框架的列表。我在 Pod 中安装了 Firebase。我已经尝试将我在 GameViewController 中使用的代码放入我的 GameScene.swift 中,但它在那里也不起作用。我不知道这是否重要,但我的游戏有一个主屏幕,一个只能通过主屏幕访问的规则屏幕,然后用户点击播放按钮开始在另一个屏幕(GameScene)中玩游戏。我对 .isReady 的检查没有 return found not ready。我需要一些帮助来解决这个问题。现在,我将尝试重新安装框架,看看是否可以。

我终于明白了。我使用了 NSNotifcationCenter。我在我的 viewDidLoad 函数中的 GameViewController.swift 中放置了一个观察者,然后是我希望它弹出的接收器。

这就是我处理来自 AdMob 的插页式广告的方式 - 使用扩展程序。我认为这是更干净的解决方案。希望对您有所帮助!

GameViewController.swift

class GameViewController: UIViewController {
    var interstitial: GADInterstitial?

    override func viewDidLoad() {
        createInterstitial()
    }

    func presentInterstitial() {
        guard let interstitial = self.interstitial where interstitial.isReady else {
            return
        }

        dispatch_async(dispatch_get_main_queue(), {
            interstitial.presentFromRootViewController(self)
        })
    }
}

GameViewController+GADInterstitialDelegate.swift

import GoogleMobileAds

extension GameViewController: GADInterstitialDelegate {
    func interstitial(ad: GADInterstitial!, didFailToReceiveAdWithError error: GADRequestError!) {
        print("\(#function): \(error.localizedDescription)")
    }

    func interstitialDidDismissScreen(ad: GADInterstitial!) {
        // Recycle interstitial
        createInterstitial()

        unpauseGame() // Some method from GameViewController
    }

    func interstitialWillPresentScreen(ad: GADInterstitial!) {
        pauseGame() // Some method from GameViewController
    }

    func createInterstitial() {
        interstitial = GADInterstitial(adUnitID: interstitialAdUnitID)
        interstitial!.loadRequest(AdMobHelper.createRequest())
        interstitial!.delegate = self
    }
}

最后一部分 - AdMobHelper.swift

import GoogleMobileAds

let interstitialAdUnitID =  "Some Id"

class AdMobHelper {
    static func createRequest() -> GADRequest {
        let request = GADRequest()
        request.testDevices = ["Check this in your logs"]
        return request
    }
}