使用Firebase身份validation时应用崩溃,原因是:“默认应用已配置完毕。”

我正在构建我的第一个iOS应用程序,我正在使用Firebase来处理身份validation,数据库等。我添加了一个注册屏幕,并使用以下代码创建一个新用户:

FIRAuth.auth()?.createUserWithEmail(emailAddress.text!, password: password.text!, completion: { (user, error) in }) 

当用户点击注册按钮时,会有一个segue应该将它们带回原始登录视图控制器。 但是,当我运行应用程序时,它会挂起启动屏幕。 这是调试器输出:

 2016-06-19 14:35:05.402 unitaskr[4386:82981] Configuring the default app. 2016-06-19 14:35:05.413 unitaskr[4386:]  Firebase Analytics v.3200000 started 2016-06-19 14:35:05.414 unitaskr[4386:]  To enable debug logging set the following application argument: -FIRAnalyticsDebugEnabled (see ...) 2016-06-19 14:35:05.419:  FIRInstanceID AppDelegate proxy enabled, will swizzle app delegate remote notification handlers. To disable add "FirebaseAppDelegateProxyEnabled" to your Info.plist and set it to NO 2016-06-19 14:35:05.418 unitaskr[4386:]  Successfully created Firebase Analytics App Delegate Proxy automatically. To disable the proxy, set the flag FirebaseAppDelegateProxyEnabled to NO in the Info.plist 2016-06-19 14:35:05.430 unitaskr[4386:82981] *** Terminating app due to uncaught exception 'com.firebase.core', reason: 'Default app has already been configured.' *** First throw call stack: ( 0 CoreFoundation 0x00000001100a8d85 __exceptionPreprocess + 165 1 libobjc.A.dylib 0x00000001108e7deb objc_exception_throw + 48 2 CoreFoundation 0x00000001100a8cbd +[NSException raise:format:] + 205 3 unitaskr 0x000000010b58844d +[FIRApp configureDefaultAppWithOptions:sendingNotifications:] + 102 4 unitaskr 0x000000010b588238 +[FIRApp configure] + 302 5 unitaskr 0x000000010b541f1a _TFC8unitaskr11AppDelegate11applicationfTCSo13UIApplication29didFinishLaunchingWithOptionsGSqGVs10DictionaryCSo8NSObjectPs9AnyObject____Sb + 266 6 unitaskr 0x000000010b542204 _TToFC8unitaskr11AppDelegate11applicationfTCSo13UIApplication29didFinishLaunchingWithOptionsGSqGVs10DictionaryCSo8NSObjectPs9AnyObject____Sb + 180 7 UIKit 0x000000010e5bf9ac -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 272 8 UIKit 0x000000010e5c0c0d -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 3415 9 UIKit 0x000000010e5c7568 -[UIApplication _runWithMainScene:transitionContext:completion:] + 1769 10 UIKit 0x000000010e5c4714 -[UIApplication workspaceDidEndTransaction:] + 188 11 FrontBoardServices 0x00000001127b78c8 __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 24 12 FrontBoardServices 0x00000001127b7741 -[FBSSerialQueue _performNext] + 178 13 FrontBoardServices 0x00000001127b7aca -[FBSSerialQueue _performNextFromRunLoopSource] + 45 14 CoreFoundation 0x000000010ffce301 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17 15 CoreFoundation 0x000000010ffc422c __CFRunLoopDoSources0 + 556 16 CoreFoundation 0x000000010ffc36e3 __CFRunLoopRun + 867 17 CoreFoundation 0x000000010ffc30f8 CFRunLoopRunSpecific + 488 18 UIKit 0x000000010e5c3f21 -[UIApplication _run] + 402 19 UIKit 0x000000010e5c8f09 UIApplicationMain + 171 20 unitaskr 0x000000010b542a42 main + 114 21 libdyld.dylib 0x00000001113b692d start + 1 ) libc++abi.dylib: terminating with uncaught exception of type NSException (lldb) 

我可以根据需要提供其他信息,我将非常感谢任何帮助/建议,因为我刚刚开始并希望尽可能多地学习。 祝你有美好的一天!

我有一个消息扩展的问题:

如果您在App扩展中 ,则没有委托,并且您必须将FIRApp.configure()放在主ViewController的init中(或者根据建议放在viewDidLoad中)。

问题是:在消息扩展中,如果用户在打开扩展的线程中按下几条消息,init(或viewdidLoad)将被多次调用,因此由于多次调用FIRApp.configure()而崩溃…

我找到的解决方案是在主View Controller中创建一个静态bool:

  static var isAlreadyLaunchedOnce = false // Used to avoid 2 FIRApp configure 

我在init或viewDidLoad中调用FIRApp.configure()之前测试它:

 // Configure Firebase // ------------------ // We check if FIRApp has already been configured with a static var, else it will crash... if !MessagesViewController.isAlreadyLaunchedOnce { FIRApp.configure() MessagesViewController.isAlreadyLaunchedOnce = true } 

这样,不再崩溃。


哦,我找到了一个更优雅的方法来解决这个问题: iOS扩展 – 致命exception:com.firebase.core默认应用程序已经配置

  // Configure Firebase // ------------------ if FIRApp.defaultApp() == nil { FIRApp.configure() } 

这样没有更多的静态;)

我写了两次FIRApp.configure() ,似乎修复了错误。

您可以在AppDelegate init方法中调用一次进行配置。

 override init() { // Firebase Init FIRApp.configure() } 

以防其他人偶然发现这个问题。 当使用googleSignIn sdk和googleSignIn sdk时。 你只需要配置一次。 要么[[GGLContext sharedInstance] configureWithError: &configureError];[FIRApp configure]

这是关于此问题的其他解决方案。 1 /检查“AppDelegate.swift”,我们将在下面看到

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

2 /从上面的代码中删除“FirebaseApp.configure()”

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

3 /将以下代码添加到“AppDelegate.swift”中

 override init() { FirebaseApp.configure() } 

4 /转到“ViewController.swift”并添加代码

  if FirebaseApp.app() == nil { FirebaseApp.configure() } 

5 /再次构建并运行它将起作用。 谢谢!

类名:AppDelegate + FCMPlugin.m

[FIRApp.configure()];

把它放在这个方法的最顶层

  • (BOOL)应用程序:(UIApplication *)应用程序customDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions

对于Swift 4

碰撞时遇到同样的问题。 尝试使用.plist文件从Firebase引用时。

(这解决了我的问题。)

尝试在viewDidLoad方法之外或之内编写:

 1. var ref: DatabaseReference! 

然后在viewDidLoad方法中引用它:

 2. Database.database().reference() 

而现在它是:

 FirebaseApp.configure() 

代替。