2015-08-02 3 views
1

Я использую Swift и SpriteKit, и все сделано внутри моего GameViewController и GameScene.iAd didFailToReceiveAdWithError не работает, иногда отображается белый ящик

Это весь код относительно объявления внутри моей GameViewController:

class GameViewController: UIViewController, ADBannerViewDelegate, GADBannerViewDelegate { 

var adBannerView: ADBannerView! 
var gadBannerView: GADBannerView! 
var bannerDisplayed = false 
var bannerNow = "iAd" 

override func viewDidLoad() { 
    super.viewDidLoad() 

    if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene { 
     // Configure the view. 
     let skView = self.view as! SKView 
     skView.showsFPS = false 
     skView.showsNodeCount = false 

     /* 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 

     if((UIDevice.currentDevice().userInterfaceIdiom == .Phone) && (UIScreen.mainScreen().bounds.height <= 480)) { 
      println("<= iPhone 4S") 
      scene.size.height = skView.bounds.size.height * 2 
      scene.size.width = skView.bounds.size.width * 2 
     } 

     NSNotificationCenter.defaultCenter().addObserver(self, selector: "hideADBanner", name: "hideAd", object: nil) 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: "showADBanner", name: "showAd", object: nil) 

     self.adBannerView = self.loadAds() 

     skView.presentScene(scene) 

     println(gadBannerView) 

    } 
} 

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

    bannerNow = "iAd" 

    self.view?.addSubview(adBannerView2) 
    return adBannerView2 
} 

func bannerViewActionShouldBegin(banner: ADBannerView!, willLeaveApplication willLeave: Bool) -> Bool { 
    println("left for ad") 
    return true 
} 

func bannerViewActionDidFinish(banner: ADBannerView!) { 
} 

func bannerViewDidLoadAd(banner: ADBannerView!) { 
    println("ad did load.") 
    println("Delegate: \(adBannerView.delegate)") 
    adBannerView.hidden = false 
    //gadBannerView?.removeFromSuperview() 
} 

func bannerView(banner: ADBannerView!, didFailToReceiveAdWithError error: NSError!) { 
    //adBannerView.removeFromSuperview() 
    //self.gadBannerView = self.createGADBanner() 
} 

func createGADBanner()->GADBannerView { 
    var ad = GADBannerView() 
    ad = GADBannerView(frame: CGRectMake(0, 0, self.view.frame.size.width, 50)) 
    ad.delegate = self 
    ad.rootViewController = self 
    ad.adUnitID = "xxxxxxxxxxx" 

    bannerNow = "GAD" 

    var reqAd = GADRequest() 
    //reqAd.testDevices = [GAD_SIMULATOR_ID] // If you want test ad's 
    ad.loadRequest(reqAd) 
    self.view.addSubview(ad) 
    println(ad) 
    return ad 
} 

func adViewDidReceiveAd(view: GADBannerView!) { 
    println("adViewDidReceiveAd:\(view)"); 
    bannerDisplayed = true 
    relayoutViews() 
} 

func adView(bannerView: GADBannerView!, didFailToReceiveAdWithError error: GADRequestError!) { 
    gadBannerView.removeFromSuperview() 
} 


func relayoutViews() { 
    if (bannerDisplayed) { 
     var bannerFrame = gadBannerView!.frame 
     bannerFrame.origin.x = 0 
     bannerFrame.origin.y = self.view.bounds.size.height - bannerFrame.size.height 

     gadBannerView!.frame = bannerFrame 
    } 
} 

func hideADBanner() { 
    println(self.gadBannerView) 
    println(bannerNow) 
    //adBannerView?.hidden = true 
    //gadBannerView?.hidden = true 
    adBannerView?.removeFromSuperview() 
    gadBannerView?.removeFromSuperview() 
} 

func showADBanner() { 
    self.adBannerView = self.loadAds() 
    //adBannerView?.hidden = false 
    //gadBannerView?.hidden = false 
} 

Так мой план должен получить объявления от AdMob, когда ОВР не работает, но проблема в том, что мой ОВР «всегда работает», даже хотя я изменил скорость заполнения внутри инструментов разработчика на своем iPhone.

Когда iAd загружает объявление, он отлично работает, вызывается функция bannerViewDidLoadAd() и отображается объявление. Хотя иногда, когда я загружаю iAd, он говорит, что я ввел bannerViewDidLoadAd(), но он отображает только белый «ящик» с логотипом iAd внизу. Теперь это не то, что я хочу, потому что AdMob никогда не появится. Println всегда выставлял один и тот же делегат, поэтому кажется, что это работает как минимум.

Этот вид никогда не освежает, потому что все, как я уже сказал, обрабатывается в GameScene, где он просто удаляет и добавляет узлы.

Спасибо!

ответ

0

Вы более усложнять очень с bool-х, ненужных функций, и это выглядит как будто вы на самом деле создал два ADBannerViews один раз в Interface Builder, self.adBannerView и один раз программно, var adBannerView: ADBannerView!.

Я создал пример с комментариями, которые помогут вам на этом пути. Что происходит здесь, мы создаем ADBannerView, настраивая его один раз в нашем viewDidLoad, а затем скрывая/показывая наш ADBannerView в зависимости от того, получает ли он объявление из сети iAd или нет. Я отказался от реализации AdMob, так как теперь он должен быть довольно прямолинейным.

import UIKit 
import iAd // Import iAd 

class ViewController: UIViewController, ADBannerViewDelegate { // Include the delegate for our ADBannerView 
    var adBannerView = ADBannerView() // Create our ADBannerView 
    // Create your GADBannerView here 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     loadAds() 
    } 

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

     // Setup your GADBannerView here in the same manner 
    } 

    func bannerViewDidLoadAd(banner: ADBannerView!) { 
     println("bannerViewDidLoadAd") 
     // We received an ad from iAd. Lets show our banner 
     adBannerView.hidden = false 
     // Hide your GADBannerView here 
    } 

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

    func bannerView(banner: ADBannerView!, didFailToReceiveAdWithError error: NSError!) { 
     println("didFailToReceiveAdWithError: \(error)") 
     // We failed to receive an ad from iAd. Lets hide our banner and print the error 
     adBannerView.hidden = true 
     // Show your GADBannerView here 
    } 
+1

Спасибо! Это то, что мне нужно, что-то твердое. У вас есть моя искренняя благодарность :) Только один вопрос, приемлемо ли просто скрыть все, когда моя игра включена, а когда игрок потерял, я просто показываю его снова? Или это более правильный путь? – Utibu

+0

Возможно, вы захотите перенести его с экрана полностью. Если ваш баннер получает другое объявление во время игры, он будет отображать себя. Просто измените рамку баннеров во время игры, а затем измените ее, как только пользователь закончит игру. –

+0

Хорошо, я еще раз благодарю вас! – Utibu

Смежные вопросы