首页 文章

AdMob发出致命错误(解包时可选择nil)

提问于
浏览
0

我正在使用 Xcode 7.3, SpriteKit, Swift, and, AdMob. 我在显示 interstitial 广告时遇到了很多麻烦 - 我也只是被介绍给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)
        }
    }
}

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

然后在我的应用程序 in a different swift file 中,我称之为:

GameViewController().displayAd()

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

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

谢谢!

1 回答

  • 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 .

    UPDATE

    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 .

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

相关问题