iosxcodeswiftadmobinterstitial

Why is my AdMob interstitial working fine in Xcode Simulator but not on my test devices?


So I have this app that has both an admob banner ad and an interstitial ad. The banner runs fine on all screens.

The interstitial ad is only supposed to load on one screen -- and it loads fine when I test it in the Xcode simulator. But when I test on my iPhone 4S and iPod Touch 5th Gen, the interstitial doesn't load and I get this error:

<Google> Request Error: Received invalid response. interstitialDidFailToReceiveAdWithError: Request Error: Received invalid response.

Anyone ever run into this before or might know why this is happening?

Here's the code I'm working with:

   // interstitial ad variable...
var interstitial: GADInterstitial?
var timer:NSTimer?
var loadRequestAllowed = true
let screen = UIScreen.mainScreen().bounds
let IS_IPAD = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.Pad
var buttonHeight:CGFloat = 0.0
var buttonOffsetY:CGFloat = 0.0
let statusbarHeight:CGFloat = 20.0
var iAdSupported = false


       // load the interstitial
    //Admob Interstitial
    buttonHeight = IS_IPAD ? 30 : 20
    buttonOffsetY = statusbarHeight
    if !iAdSupported {
        interstitial = createAndLoadInterstitial()
    } // closes if !iAdSupported

 

//        presentInterstitial()
    timer = NSTimer.scheduledTimerWithTimeInterval(1, target:self, selector: Selector("presentInterstitial"), userInfo: nil, repeats: false)
    println("the timer made presentInterstitial run")




 //Interstitial func
func createAndLoadInterstitial()->GADInterstitial {
    println("createAndLoadInterstitial")
    var interstitial = GADInterstitial(adUnitID: "ca-app-pub-4471013071748494/2225255714")
    
    interstitial.delegate = self
    interstitial.loadRequest(GADRequest())
    
    return interstitial
} // closes createAndLoadInterstitial …

func presentInterstitial() {
    if let isReady = interstitial?.isReady {
        interstitial?.presentFromRootViewController(self)
        println("presentInterstitial function ran")
    } // closes if let isReady
} // closes presentInterstitial …



//Interstitial delegate
func interstitial(ad: GADInterstitial!, didFailToReceiveAdWithError error: GADRequestError!) {
    println("interstitialDidFailToReceiveAdWithError:\(error.localizedDescription)")
    //  ResultsBtn?.enabled = false
    interstitial = createAndLoadInterstitial()
} // closes interstitial …

Solution

  • You are attempting to present your interstitial before it has a chance to load. Your timer fires func presentInterstitial after one second. Change this to a larger number to give the interstitial time to load.

    import UIKit
    import GoogleMobileAds
    
    class ViewController: UIViewController, GADInterstitialDelegate {
        
        var admobInterstitial : GADInterstitial?
        var timer : NSTimer?
    
        override func viewDidLoad() {
            super.viewDidLoad()
            
            admobInterstitial = createAndLoadInterstitial()
            timer = NSTimer.scheduledTimerWithTimeInterval(5.0, target:self, selector: Selector("presentInterstitial"), userInfo: nil, repeats: false)
        }
     
        func createAndLoadInterstitial()->GADInterstitial {
            var interstitial = GADInterstitial(adUnitID: "yourAdMobADUnitID")
            interstitial.delegate = self
            interstitial.loadRequest(GADRequest())
            return interstitial
        }
        
        func presentInterstitial() {
            if let isReady = admobInterstitial?.isReady {
                admobInterstitial?.presentFromRootViewController(self)
            }
        }
        
        func interstitial(ad: GADInterstitial!, didFailToReceiveAdWithError error: GADRequestError!) {
            println("interstitialDidFailToReceiveAdWithError:\(error.localizedDescription)")
            admobInterstitial = createAndLoadInterstitial()
        }