Swift Admob 问题的主题 1 : EXC_BAD_INSTRUCTION

标签 swift swift3 admob cocoapods exc-bad-instruction

我几天来一直在解决以下问题,但我对此感到有点不安。所以我有一个项目文件https://github.com/PCmex/lift-side-memu-in-swift-3我用它成功启动了Cocoapod。我遵循了整个 admob 教程并完成了所有必需的步骤。当我尝试测试应用程序时,构建正常,但应用程序启动后它崩溃并提供以下信息:

Screenshot for error message: Thread 1: EXC_BAD_INSTRUCTION

日志提供了以下信息: Google 移动广告 SDK 版本:(GADRequest.sdkVersion()) fatal error :在解包可选值时意外发现 nil (lldb)

这是应用程序 delegate.swift

import UIKit
import GoogleMobileAds
import Firebase

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?


func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    //Use Firebase library to configure APIs
    FirebaseApp.configure()
    GADMobileAds.configure(withApplicationID: "ca-app-pub-***")
    return true
}

func applicationWillResignActive(_ application: UIApplication) {
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
}

func applicationDidEnterBackground(_ application: UIApplication) {
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}

func applicationWillEnterForeground(_ application: UIApplication) {
    // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
}

func applicationDidBecomeActive(_ application: UIApplication) {
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}

func applicationWillTerminate(_ application: UIApplication) {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}


}

这是 ViewController.swift

import UIKit
import GoogleMobileAds
import Firebase

class ViewController: UIViewController {

@IBOutlet weak var btnMenuButton: UIBarButtonItem!
@IBOutlet weak var bannerView: GADBannerView!
override func viewDidLoad() {
    super.viewDidLoad()

    // Aanroepen print functie voor de Google AdMob banner
    print("Google Mobile Ads SDK version:(GADRequest.sdkVersion())")
    bannerView.adUnitID = "ca-app-pub-***"
    bannerView.rootViewController = self
    bannerView.load(GADRequest())

    // Do any additional setup after loading the view, typically from a nib.
    if revealViewController() != nil {
        //            revealViewController().rearViewRevealWidth = 62
        btnMenuButton.target = revealViewController()
        btnMenuButton.action = #selector(SWRevealViewController.revealToggle(_:))

//            revealViewController().rightViewRevealWidth = 150
//            extraButton.target = revealViewController()
//            extraButton.action = "rightRevealToggle:"




    }
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


}

我很确定我已经正确安装了 cocoa-pod/AdMob 和所有先决条件。当我完成新项目中的所有步骤时,一切正常。但我试图理解为什么它在我当前的项目中不起作用。希望有人能指出我正确的方向,提前致谢!

最佳答案

变量bannerView是一个隐式解包的可选。这意味着它可选变量类型。请记住,如果其值为 nil,则展开选项将会崩溃,因此通常您会在展开之前进行一些可选链接(例如 if let)进行测试,以防止崩溃了。在您的情况下,bannerViewnil,因此您的应用程序崩溃了。隐式解包可选是通过在其类型后面放置 ! 来声明的(在您的情况下为 GADBannerView!)。

我建议您转到 Controller 的 Storyboard(或 XIB),选择 GADBannerView 并转到连接检查器

connections inspector

并检查“引用 socket ”部分中是否有任何内容(“新引用 socket ”除外)。如果有,请单击X按钮断开连接。

Break connection

然后删除 Controller 中的 @IBOutlet Weak var BannerView 行,并将 GADBannerView 重新连接到 ViewController。如果该部分中没有任何内容,只需删除 @IBOutlet weak varbannerView 并将 GADBannerView 重新连接到 ViewController

关于Swift Admob 问题的主题 1 : EXC_BAD_INSTRUCTION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45139703/

相关文章:

ios - Today Extension 更改后刷新应用程序上的 CoreData

ios - 显示拉伸(stretch) Material 应用于 SCNGeometrySource 节点

swift - 无法基于检查挂接到另一个 RxSwift 流

ios - 带有错误的 Swift 3 Eureka 验证 UILabel

ios - AdMob 广告未在 iOS 中展示

ios - 为什么在设置框架时不能更改按钮高度?

ios - 如何快速从结构中检索值

swift - 在下一个 UI View 出现之前获取用户身份验证

android - 回收 View 中的 Admob

Admob "request pin"新地址不起作用