Ошибка приложения при использовании Firebase Auth, причина: "Приложение по умолчанию уже настроено".

Я создаю свое первое приложение для 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) 

Я могу предоставить дополнительную информацию по мере необходимости, любая помощь/совет будут очень признательны, поскольку я только начинаю и стараюсь учиться как можно больше. Хорошего дня!

Ответ 1

У меня возникла проблема с Расширением сообщений:

Если вы находитесь в Расширении приложения, у вас нет делегата, и вам нужно будет поместить FIRApp.configure() в init вашего основного ViewController (или в viewDidLoad как предложил).

Проблема заключается в том, что в расширении сообщений, если пользователь нажимает несколько сообщений в потоке, открывающем расширение, init (или viewdidLoad) будет вызываться несколько раз, поэтому сбой из-за вызова FIRApp.configure() несколько раз...

Решением, которое я нашел, было создание статического bool в главном контроллере представления:

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

и я тестирую его перед вызовом FIRApp.configure() в init или viewDidLoad:

// 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 - Fatal Exception: com.firebase.core Приложение по умолчанию уже настроено

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

Больше не статично;)

Ответ 2

Я дважды писал FIRApp.configure(), что, по-видимому, исправляло ошибку.

Ответ 3

Вы можете позвонить один раз в метод инициализации AppDelegate для настройки.

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

Ответ 4

на случай, если кто-то еще наткнется на эту проблему. при использовании firebase sdk с googleSignIn sdk. вам нужно только настроить их один раз. либо делать [[GGLContext sharedInstance] configureWithError: &configureError]; или [FIRApp configure]

Ответ 5

Имя класса: AppDelegate + FCMPlugin.m

[FIRApp.configure()];

Поместите это вверху большинства этого метода.

  • (BOOL): (UIApplication *) приложение customDidFinishLaunchingWithOptions: (NSDictionary *) launchOptions