Así que estoy tratando de configurar un banner iAd simple en mi aplicación, pero recibo estas dos advertencias en el resultado:

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.

Y

<Error>: CGAffineTransformInvert: singular matrix.

Esto es lo que estoy usando para implementar mi 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)

Intenté agregar esto para detener el primer error: (no ha funcionado)

//BannerView will disappear
override func viewWillDisappear(animated: Bool) {
    adBannerView.removeFromSuperview()
    adBannerView.delegate = nil
}
11
Luke Martin 14 feb. 2015 a las 13:41

3 respuestas

La mejor respuesta

El problema es que cada vez que carga su vista, está creando una nueva instancia de ADBannerView. Lo que tenemos que hacer es crear un ADBannerView una vez en nuestro AppDelegate.swift y luego presentar este ADBannerView en las vistas que nos gustaría tener un banner de iAd. Esto también se denomina banner de iAd compartido. En este ejemplo, creé un ADBannerView en mi AppDelegate.swift y luego lo agregué a la vista de mi ViewController.swift.

AppDelegate.swift

import UIKit
import iAd // Import iAd

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, ADBannerViewDelegate { // Include the delegate for our banner

    var window: UIWindow?
    var adBannerView = ADBannerView() // Create our one ADBannerView

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Set delegate and hide banner initially
        adBannerView.delegate = self
        adBannerView.hidden = true
        return true
    }

    func bannerViewDidLoadAd(banner: ADBannerView!) {
        print("bannerViewDidLoadAd")
        adBannerView.hidden = false
    }

    func bannerViewActionDidFinish(banner: ADBannerView!) {
        print("bannerViewActionDidFinish")
    }

    func bannerView(banner: ADBannerView!, didFailToReceiveAdWithError error: NSError!) {
        print("didFailToReceiveAdWithError: \(error)")
        adBannerView.hidden = true
    }

ViewController.swift

import UIKit

class ViewController: UIViewController {

    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate // Create reference to our app delegate

    override func viewWillAppear(animated: Bool) {
        // Position
        appDelegate.adBannerView.center = CGPoint(x: view.frame.midX,
            y: view.frame.height - appDelegate.adBannerView.frame.height / 2)
        // Add to view
        view.addSubview(appDelegate.adBannerView)
    }

No olvide eliminar el código de su función viewWillDisappear(animated: Bool) que agregó anteriormente. Si hace clic en el banner y luego lo descarta, se llamará a esta función y eliminar nuestro banner de nuestra vista y configurar nuestro delegado de banners en cero demasiado pronto causará problemas.

18
Daniel Storm 6 oct. 2015 a las 13:07

Si desea que el banner persista entre las pestañas y no desaparezca al cambiar rápidamente de pestaña, debe hacer el enfoque de iAd Suite: http://developer.apple.com/library/ios/#samplecode/iAdSuite/Introduction/Intro.html (Consulte BannerViewController.m archivo - no en Swift, pero no es difícil convertirlo)

Este enfoque tampoco requiere que modifique ninguno de los controladores de vista dentro de sus pestañas. Simplemente tiene que tener una relación entre el controlador de la barra de pestañas y un controlador de vista que tenga una vista de contenedor incrustada. Haz eso en tu guión gráfico. Además, debe establecer Clase personalizada en BannerViewController para cada pestaña e incrustar su contenido en la vista incrustada. Eche un vistazo a esta publicación para obtener detalles sobre cómo hacerlo en el Storyboard: https://stackoverflow.com/a/16205420/5007500

Si no está utilizando Storyboard, debe configurar BannerViewController como controlador de vista principal para cada una de sus pestañas.

1
Community 23 may. 2017 a las 12:26

Si no desea preocuparse por el tamaño, la posición, el manejo de errores y los métodos de delegación de su anuncio de banner, también puede utilizar:

self.canDisplayBannerAds = true

Esto solucionó el error en mi aplicación, porque Apple también se preocupa por la cantidad de instancias

He escrito un breve tutorial sobre esto: enlace

1
Stefan 9 jul. 2015 a las 20:26