So I am trying to set up a simple iAd banner in my application but I am getting these two warnings in the output:
WARNING: More than 10 instances of ADBannerView or ADInterstitialView
currently exist. This is a misuse of the iAd API, and ad performance will
suffer as a result. This message is printed only once.
and
<Error>: CGAffineTransformInvert: singular matrix.
This is what I am using to implement my ADBannerView
:
var adBannerView = ADBannerView()
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)
}
//BannerView did load ad
func bannerViewDidLoadAd(banner: ADBannerView!) {
adBannerView.hidden = false
}
//BannerView failed to load
func bannerView(banner: ADBannerView!, didFailToReceiveAdWithError error: NSError!) {
adBannerView.hidden = true
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
loadAds()
//(rest of the code is from here onwards)
I tried adding this to stop the first error: (hasn't worked)
//BannerView will disappear
override func viewWillDisappear(animated: Bool) {
adBannerView.removeFromSuperview()
adBannerView.delegate = nil
}
If you want the banner to persist between the tabs and not disappear when rapidly switching tabs, you've got to do the iAd Suite approach: http://developer.apple.com/library/ios/#samplecode/iAdSuite/Introduction/Intro.html (Check out BannerViewController.m file - not in Swift, but it's not hard to convert it)
This approach also doesn't require you to modify any go the view controllers within your tabs. You simply have to have a relationship segue from your tab bar controller to a View Controller that has container view embedded into it. Do that in your storyboard. Also, you need to set Custom Class to BannerViewController for each tab, and embed your content into the embedded view. Take a look at this post for details on how to do it it the Storyboard: https://stackoverflow.com/a/16205420/5007500
If you are not using Storyboard - you need to set BannerViewController as parent view controller for each of your tabs.
If you don't want to care about the size, position, error handling and the delegate methods of your banner ad you can also use:
This solved the error in my App, because Apple takes also care about the number of instances
I've written a short tutorial about this: link
The issue is every time you load your view you are creating a new instance of
ADBannerView
. What we need to do is create aADBannerView
once in ourAppDelegate.swift
and then present thisADBannerView
on which ever views we would like to have an iAd banner. This is also called a Shared iAd Banner. In this example, I've created anADBannerView
in myAppDelegate.swift
and then added it to myViewController.swift
's view.AppDelegate.swift
ViewController.swift
Don't forget to remove the code from your
viewWillDisappear(animated: Bool)
function that you added previously. If you click on the banner and then dismiss it this function will be called and removing our banner from our view and setting our banners delegate equal to nil too soon will cause issues.