Search code examples
swiftsprite-kitiad

Spritekit Supporting iAd


I have been looking everywhere on the web for tutorials on how to include iad banners in my spritekit game. For example I looked at this: Swift SpriteKit iAd but I got some errors, probaly due to the new swift 2 and swift 1. But could you explain what to do to include IAD in my spritekit game. Thank you in advance.


Solution

  • Make sure you have this code in your GameViewController. I just tested this out and it works for landscape and portrait mode.

     class GameViewController: UIViewController, ADBannerViewDelegate {
    
    //--------------------
    //-----iAd Banner-----
    //--------------------
    var SH = UIScreen.mainScreen().bounds.height
    let transition = SKTransition.fadeWithDuration(0)
    var UIiAd: ADBannerView = ADBannerView()
    
    override func viewWillAppear(animated: Bool) {
        let BV = UIiAd.bounds.height
        UIiAd.delegate = self
        UIiAd.frame = CGRectMake(0, SH + BV, 0, 0)
        self.view.addSubview(UIiAd)
    }
    
    override func viewWillDisappear(animated: Bool) {
        UIiAd.delegate = nil
        UIiAd.removeFromSuperview()
    }
    
    func bannerViewDidLoadAd(banner: ADBannerView!) {
        UIView.beginAnimations(nil, context: nil)
        UIView.setAnimationDuration(0.5) // Time it takes the animation to complete
        UIiAd.alpha = 1 // Fade in the animation
        UIView.commitAnimations()
    }
    
    func bannerView(banner: ADBannerView!, didFailToReceiveAdWithError error: NSError!) {
        UIView.beginAnimations(nil, context: nil)
        UIView.setAnimationDuration(0.5)
        UIiAd.alpha = 0
        UIView.commitAnimations()
    }
    
    func showBannerAd() {
        UIiAd.hidden = false
        let BV = UIiAd.bounds.height
    
        UIView.beginAnimations(nil, context: nil)
        UIView.setAnimationDuration(0.5) // Time it takes the animation to complete
        UIiAd.frame = CGRectMake(0, SH - BV, UIScreen.mainScreen().bounds.width, 0)
        UIView.commitAnimations()
    }
    
    func hideBannerAd() {
        UIiAd.hidden = true
        let BV = UIiAd.bounds.height
    
        UIView.beginAnimations(nil, context: nil)
        UIView.setAnimationDuration(0.5) // Time it takes the animation to complete
        UIiAd.frame = CGRectMake(0, SH + BV, UIScreen.mainScreen().bounds.width, 0) //Beginning position of the ad
        UIView.commitAnimations()
    }
    
    
    
    //--------------------
    //-----View Loads-----
    //--------------------
    override func viewDidLoad() {
        super.viewDidLoad()
        //iAd Control
        self.UIiAd.hidden = true
        self.UIiAd.alpha = 0
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(GameViewController.hideBannerAd), name: "hideadsID", object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(GameViewController.showBannerAd), name: "showadsID", object: nil)
    }
    

    Add the following outside your class declarations. It doesn't matter what class you go to, as long as it's global so you can access them from any game scene.

     //-------------
     //-----Ads-----
     //-------------
     func showAds() {
         NSNotificationCenter.defaultCenter().postNotificationName("showadsID", object: nil)
     }
     func hideAds() {
         NSNotificationCenter.defaultCenter().postNotificationName("hideadsID", object: nil)
     }
    

    And then whenever you want to show ads in the specific scene or whenever, just call the "showAds()" function or "hideAds()" to hide them.