iAd in xcode 6 with Swift

Benzene picture Benzene · Jul 16, 2014 · Viewed 8.2k times · Source

I'm working to implement a banner ad in the scene, but it always reports "Thread 1: EXC_BREAKPOINT(code=EXC_ARM_BREAKPOINT, subcode=Oxdefe) and the program stops running. I referenced Mr. T's answer in another question about iAd("Swift - ADBannerView") but still couldn't make it.

The code looks like this:

 import UIKit
 import SpriteKit
 import iAd
 class GameViewController: UIViewController, ADBannerViewDelegate {

@IBOutlet var adBannerView: ADBannerView
override func viewDidLoad() {
    super.viewDidLoad()
    println("view loaded")

    //iAd
    self.canDisplayBannerAds = true
    self.adBannerView.delegate = self
    self.adBannerView.alpha = 0.0 
     if let scene = GameScene.unarchiveFromFile("GameScene") as? 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

        skView.presentScene(scene)
    }
}
 //iAd
func bannerViewWillLoadAd(banner: ADBannerView!) {


    println("sort of working1")

}

func bannerViewDidLoadAd(banner: ADBannerView!) {


    self.adBannerView.alpha = 1.0 
    println("sort of working2")

}

func bannerViewActionDidFinish(banner: ADBannerView!) {


    println("sort of working3")

}

func bannerViewActionShouldBegin(banner: ADBannerView!, willLeaveApplication willLeave: Bool) -> Bool {



    println("sort of working4")
    return true 
}

func bannerView(banner: ADBannerView!, didFailToReceiveAdWithError error: NSError!) {


}
}

And I created an ADBannerView in the Main.storyboard and linked it with the @IBOutlet adBannerView.

Anyone helps me figure out?

Answer

erdekhayser picture erdekhayser · Jul 16, 2014

This is how I did it, possibly not all of it is necessary.

I did not use the banner in the Storyboard, so the IBOutlet is not necessary.

Also, if you manually create a banner, you do not need to set self.canDisplayBannerAds

This function (ported from ObjC) is how I display the ads.

func loadAds(){
  adBannerView = ADBannerView(frame: CGRect.zeroRect)
  adBannerView.center = CGPoint(x: adBannerView.center.x, y: view.bounds.size.height - adBannerView.frame.size.height / 2)
  adBannerView.delegate = self
  adBannerView.hidden = true
  view.addSubview(adBannerView)
}

This is called in viewDidLoad. Then, in the didLoadAd delegate method, I set adBannerView.hidden = false and in didFailToReceiveAdWithError, adBannerView.hidden = true

I think hidden is better than alpha in this situation, as it feels more natural. I believe (but am not sure) that when hidden, the view is not drawn at all by the GPU, while with an alpha of 0, it is still drawn, but made invisible (correct me if I am wrong).

This is my setup, and it worked for me, so hopefully it will work in your case too!