Using AdMob interstitial ads in iOS game applications and Swift

六眼飞鱼酱① 提交于 2019-12-24 06:37:12

问题


Okay, I've spent days now doing this. I've gone through admob's tutorials, youtube, stack exchange, everything and I cannot find a solution to my problem.

I'm trying to implement admob's interstitial ads into my iOS game application. The code compiles, builds, runs, the game is played, but ads will not show up. This is my 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)
    }
}

This is how I'm calling it to my 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()
}

So when the game is over, a function makes a restart button appear. Then I want my interstitial ad to pop up so the user has to exit the interstitial ad to hit the replay button. That variable varForGVC is an implemented earlier in the GameScene.swift by varForGVC = GameViewController()

I have my app synced with Firebase and admob. I have the GoogleService-Info.plist in my root. I have the list of required frameworks for admob in my root as well. I have pod installed with Firebase. I've tried putting the code I'm using in my GameViewController into my GameScene.swift and it did not work there either. I don't know if this matters, but my game has a Main Screen, a Rules screen only accessible via the main screen, then the user hits a Play button to begin playing the game in another Screen (the GameScene). My check for .isReady does not return found not ready. I need some help with this issue. For now, I'm going to try to reinstall the frameworks and see if that's it.


回答1:


This is how I work with interstitial ads from AdMob - using extension. I think it's way more clean solution. Hope it will help you!

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
    }
}

And the last part - 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
    }
}



回答2:


I figured it out finally. I used NSNotifcationCenter. I put in an observer in my GameViewController.swift in my viewDidLoad function, then a receiver where I wanted it to pop up.



来源:https://stackoverflow.com/questions/37914084/using-admob-interstitial-ads-in-ios-game-applications-and-swift

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!