【问题标题】:App crashing when using Firebase Auth, reason: 'Default app has already been configured.'使用 Firebase 身份验证时应用程序崩溃,原因:“已配置默认应用程序。”
【发布时间】:2016-10-21 00:21:54
【问题描述】:

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

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

        })

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

2016-06-19 14:35:05.402 unitaskr[4386:82981] Configuring the default app.
2016-06-19 14:35:05.413 unitaskr[4386:] <FIRAnalytics/INFO> Firebase Analytics     v.3200000 started
2016-06-19 14:35:05.414 unitaskr[4386:] <FIRAnalytics/INFO> To enable debug logging set the following application argument: -FIRAnalyticsDebugEnabled (see ...)
2016-06-19 14:35:05.419: <FIRInstanceID/WARNING> 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:] <FIRAnalytics/INFO> 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) 

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

【问题讨论】:

    标签: ios swift firebase firebase-authentication


    【解决方案1】:

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

    【讨论】:

    • 我不小心做了同样的事情,它抛出了同样的错误。你应该没有问题了!
    • 谢谢兄弟,我也犯了同样的错误
    • 那可能是因为没有 .plist 文件,根本没有注册。
    【解决方案2】:

    AppDelegate init 方法中调用一次即可进行配置。

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

    【讨论】:

    • 我在没有 AppDelegate 类的扩展键盘类中调用此方法。那我该怎么办?
    • 尝试在您的视图控制器 viewDidLoad 中调用它。覆盖 func viewDidLoad() { }
    • 但这就是问题所在,因为如果我将我的扩展键盘更改为本机并将本机更改为扩展,那么它会崩溃并抛出相同的错误。
    • 你可以扩展视图控制器并调用它们两次吗?并重新检查
    • override func viewDidLoad() { super.viewDidLoad() FIRApp.configure() } //这是我在键盘扩展 UIInputViewController 类中编写的。但是,当我将键盘切换到本机 ios 键盘并再次切换到我的键盘时,会调用此方法并发生崩溃,并出现此 错误- [原因:'默认应用程序已配置。']
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我遇到了 Messages Extension 问题:

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

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

      我找到的解决方案是在主视图控制器中创建一个静态布尔值:

          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 Extension - Fatal Exception: com.firebase.core Default app has already been configured

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

      这种方式不再是静态的;)

      【讨论】:

      • 这很好。在扩展上下文中使用它。
      • 是的,唯一的缺点是我们得到了一个关于 firebase 尚未配置的烦人日志。
      • 如果 FIRApp.defaultApp() == nil { FIRApp.configure() } 为我工作,谢谢!
      • 如果 FirebaseApp.app() == nil { FirebaseApp.configure() }
      【解决方案5】:

      类名:AppDelegate+FCMPlugin.m

      [FIRApp.configure()];

      把这个放在这个方法的最上面

      - (BOOL)application:(UIApplication *)application customDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
       if(![FIRApp defaultApp]){
          [FIRApp configure];}}
      

      【讨论】:

      • 这对我有用。但问题是为什么?我是 Flutter for iOS 的新手,昨晚这一直困扰着我。
      【解决方案6】:

      对于 Swift 4

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

      (这解决了我的问题。)

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

      1. var ref: DatabaseReference!
      

      然后在 viewDidLoad 方法中引用它:

      2. Database.database().reference()
      

      现在是:

      FirebaseApp.configure()
      

      相反。

      【讨论】:

        【解决方案7】:

        这是有关此问题的其他解决方案。 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/ 再次构建并运行它会起作用。谢谢!

        【讨论】:

          【解决方案8】:

          对于 Swift 4,

          if FirebaseApp.app() == nil {
          /// code snippet
          }
          

          【讨论】:

            【解决方案9】:

            如果您正在使用 Scene 委托,并且您有 不同的 iOS 版本,例如 9、10 到 13,则必须以这种方式调用 AppDelegate.swift

             if #available(iOS 13.0, *) {
             
             } else {
                 FirebaseApp.configure()
             }
            

            SceneDelegate.swift 中这样:

             if #available(iOS 13.0, *) {
               FirebaseApp.configure()
             }
            

            这些设置将排除错误,例如: *

            *** 由于未捕获的异常“com.firebase.core”而终止应用程序,原因:“已配置默认应用程序。”

            【讨论】:

              【解决方案10】:

              这是我的 AppDelegate.swift 代码

              import UIKit
              import Flutter
              import Firebase
              
              @UIApplicationMain
              @objc class AppDelegate: FlutterAppDelegate {
                override func application(
                  _ application: UIApplication,
                  didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
                ) -> Bool {
                  GeneratedPluginRegistrant.register(with: self)
                FirebaseApp.configure()
                  return super.application(application, didFinishLaunchingWithOptions: launchOptions)
                }
              }
              

              您可以将此FirebaseApp.configure() 删除或添加

               if #available(iOS 13.0, *) {
               
               } else {
                   FirebaseApp.configure()
               }
              

              两者都为我工作

              【讨论】:

                【解决方案11】:

                这是因为您已经在 AppDelegate 中初始化了 FirebaseApp.configure()请确保它只配置一次并且错误应该消失。

                【讨论】:

                  猜你喜欢
                  • 2018-08-20
                  • 2018-05-05
                  • 2019-12-20
                  • 2018-06-23
                  • 2022-11-24
                  • 2018-10-21
                  • 2021-10-03
                  • 1970-01-01
                  • 2021-04-26
                  相关资源
                  最近更新 更多