Swift Admob 问题的线程 1:EXC_BAD_INSTRUCTION
Swift Admob issue's Thread 1: 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())
致命错误:在展开可选值时意外发现 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
以进行测试,以防止崩溃。在您的情况下,bannerView
是 nil
,因此您的应用程序崩溃了。通过在其类型之后放置 !
来声明隐式展开的可选(在您的情况下,GADBannerView!
)。
我建议你转到控制器的 故事板 (或 XIB),select 你的 GADBannerView
并转到连接检查器
然后检查 "Referencing Outlets" 部分是否有任何内容(“New Referencing Outlet”除外)。如果有,请单击 X 按钮断开连接.
然后删除Controller中的@IBOutlet weak var bannerView
行,重新连接GADBannerView
到ViewController
。如果该部分中没有任何内容,只需删除 @IBOutlet weak var bannerView
并将 GADBannerView
重新连接到 ViewController
几天来我一直在研究以下问题,对此我有点不高兴。所以我有一个项目文件 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()) 致命错误:在展开可选值时意外发现 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
以进行测试,以防止崩溃。在您的情况下,bannerView
是 nil
,因此您的应用程序崩溃了。通过在其类型之后放置 !
来声明隐式展开的可选(在您的情况下,GADBannerView!
)。
我建议你转到控制器的 故事板 (或 XIB),select 你的 GADBannerView
并转到连接检查器
然后检查 "Referencing Outlets" 部分是否有任何内容(“New Referencing Outlet”除外)。如果有,请单击 X 按钮断开连接.
然后删除Controller中的@IBOutlet weak var bannerView
行,重新连接GADBannerView
到ViewController
。如果该部分中没有任何内容,只需删除 @IBOutlet weak var bannerView
并将 GADBannerView
重新连接到 ViewController