AdMob发出致命错误(在展开可选内容时找到nil)

时间:2016-04-10 18:17:08

标签: ios swift admob

我正在使用 Xcode 7.3,SpriteKit,Swift和AdMob。我在显示插页式广告广告方面遇到了很多麻烦 - 我也是刚刚被介绍到GameViewController(我忘了这个文件甚至是项目的一部分,所以我可能没有正确使用它。)

以下是我的GameViewController.swift的重要部分:

import UIKit
import SpriteKit
import GoogleMobileAds

class GameViewController: UIViewController {

    var interstitial: GADInterstitial!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.interstitial = GADInterstitial(adUnitID: "ca-app-pub-3940256099942544/4411468910")
        let request = GADRequest()
        // Requests test ads on test devices.
        request.testDevices = ["2077ef9a63d2b398840261c8221a0c9b"]
        self.interstitial.loadRequest(request)

        //I deleted the code that starts up my first scene here to save space on this post
    }
    func displayAd() {
        if self.interstitial.isReady {
            self.interstitial.presentFromRootViewController(self)
        }
    }
}

正如你所看到的,我删除了默认情况下出现的覆盖功能,因为那些可能不是问题的一部分(他们仍然在我的项目中不用担心)。

然后在我的应用中,在另一个快速文件中,我称之为:

GameViewController().displayAd()

我没有错误,但是当我运行应用程序并调用该行时,我得到了常见的fatal error: unexpectedly found nil while unwrapping an Optional value错误。如果我在displayAd()文件中调用GameViewController函数,则不会发生这种情况(但这不是真正有用的,因为那不是场景)。

有关我做错的建议吗?如果您有正确设置此广告设置的提示,请告诉我,我已经在这工作了几个小时@ _ @。

谢谢!

1 个答案:

答案 0 :(得分:1)

当你调用这个函数GameViewController()。displayAd()时。它正在初始化GameViewController。此时var interstitial:GADInterstitial!没有。因为这是在viewDidLoad之后设置的。这就是您的应用崩溃的原因。

您需要在视图控制器初始化时初始化标识符,如下所示

import UIKit
import SpriteKit
import GoogleMobileAds

class GameViewController: UIViewController {

    var interstitial: GADInterstitial = GADInterstitial(adUnitID: "ca-app-pub-3940256099942544/4411468910")

    override func viewDidLoad() {
        super.viewDidLoad()
        let request = GADRequest()
        // Requests test ads on test devices.
        request.testDevices = ["2077ef9a63d2b398840261c8221a0c9b"]
        self.interstitial.loadRequest(request)

        //I deleted the code that starts up my first scene here to save space on this post
    }
    func displayAd() {
        if self.interstitial.isReady {
            self.interstitial.presentFromRootViewController(self)
        }
    }
}

但我认为如果GameViewController没有加载到屏幕上,那么我怀疑它是否会展示你的广告。你应该调用AppDelegate displayAdFrom Window RootViewController。

<强>更新

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func displayAds() {
       let interstitial: GADInterstitial = GADInterstitial(adUnitID: "ca-app-pub-3940256099942544/4411468910")
       let request = GADRequest()
       // Requests test ads on test devices.
       request.testDevices = ["2077ef9a63d2b398840261c8221a0c9b"]
       self.interstitial.loadRequest(request)
       if self.interstitial.isReady {
           self.interstitial.presentFromRootViewController(window.rootViewController)
       }
    }

}

您可以调用此功能 (UIApplication.sharedApplication()。委托为!AppDelegate).displayAds。

没有经验。如果仍有问题,你将不得不挖掘自己。