Search code examples
iosswiftfirebaseadmobinterstitial

admob interstitial ad is never ready


i have this game and i created 3 funcions in my gameviewcontroller and here they are

    func getInterstitialAd(){
    interstitial = GADInterstitial(adUnitID: "ca-app-pub-1782852253088296/5018877964")
    let requestInterstitial = GADRequest()
    interstitial.load(requestInterstitial)
}



func showAd() {

    if (interstitial.isReady == true){
        interstitial.present(fromRootViewController: GameViewController())
    }else{
        print("ad wasn't ready")
        interstitial = createAd()
    }



}

func createAd() -> GADInterstitial{
    let interstital = GADInterstitial(adUnitID: "ca-app-pub-1782852253088296/5018877964")
    interstitial.load(GADRequest())
    return interstital
}

and in one of my scene called StartMenu , i call those function

   var viewController: GameViewController!

and then i call the functions

       viewController.getInterstitialAd()
        viewController.showAd()

but it always returns ad not ready , and false for interstitial.isReady, but also the getInterstitial function is always called .

can someone help with that please


Solution

  • Create a new swift file AdMobDelegate :-

    import UIKit
    import GoogleMobileAds
    
    class AdMobDelegate: NSObject, GADInterstitialDelegate {
    
        var interstitialView: GADInterstitial!
    
        func createAd() -> GADInterstitial {
            interstitialView = GADInterstitial(adUnitID: "Your Key")
            interstitialView.delegate = self
            let request = GADRequest()
            interstitialView.loadRequest(request)
            return interstitialView
        }
    
        func showAd() {
            if interstitialView != nil {
                if (interstitialView.isReady == true){
                    interstitialView.present(fromRootViewController:currentVc)
                } else {
                    print("ad wasn't ready")
                    interstitialView = createAd()
                }
            } else {
                print("ad wasn't ready")
                interstitialView = createAd()
            }
        }
    
        func interstitialDidReceiveAd(ad: GADInterstitial!) {
            print("Ad Received")
            if ad.isReady {
                interstitialView.present(fromRootViewController: currentVc)
            }
       }
    
        func interstitialDidDismissScreen(ad: GADInterstitial!) {
            print("Did Dismiss Screen")
        }
    
        func interstitialWillDismissScreen(ad: GADInterstitial!) {
            print("Will Dismiss Screen")
        }
    
        func interstitialWillPresentScreen(ad: GADInterstitial!) {
            print("Will present screen")
        }
    
        func interstitialWillLeaveApplication(ad: GADInterstitial!) {
            print("Will leave application")
        }
    
        func interstitialDidFailToPresentScreen(ad: GADInterstitial!) {
            print("Failed to present screen")
        }
    
        func interstitial(ad: GADInterstitial!, didFailToReceiveAdWithError error: GADRequestError!) {
            print("\(ad) did fail to receive ad with error \(error)")
        }
    }
    

    Now you can use the object of this delegate class in other files as follows :-

    //Define admobdelegate as global variable
    var admobDelegate = AdMobDelegate()
    
    //Declare a global variable currentVc to hold reference to current view controller
    var currentVc: UIViewController!
    
    class abc1: UIViewController {
    
        override func viewdidload() {
            super.viewdidload()
            currentVc = self
            admobDelegate.showAd()
        }
    
        override func viewDidAppear() {
            super.viewDidAppear()
            currentVc = self
        }
    }
    
    class abc2: UIViewController {
    
        override func viewdidload() {
            super.viewdidload()
            currentVc = self
            admobDelegate.showAd()
        }
    
        override func viewDidAppear() {
            super.viewDidAppear()
            currentVc = self
        }
    }
    

    Code is in Swift 2.2. Write your equivalent code in swift 3 in case of syntax error.