10

I am trying to configure the Firebase using FirebaseApp.configure() but facing the following crash:

 *** Terminating app due to uncaught exception 'com.firebase.installations', reason: 'The default FirebaseApp instance must be configured before the defaultFirebaseApp instance can be initialized. One way to ensure that is to call `[FIRApp configure];` (`FirebaseApp.configure()` in Swift) in the App Delegate's `application:didFinishLaunchingWithOptions:` (`application(_:didFinishLaunchingWithOptions:)` in Swift).'
*** First throw call stack:
(0x195b7180c 0x195899fa4 0x195a66f84 0x1081413dc 0x107c59bc0 0x107c59aec 0x10274daa0 0x10274d5c0 0x10274c8ec 0x10274c310 0x10274c25c 0x10244b52c 0x10244b434 0x10244b5c4 0x199bda698 0x102451ad4 0x195974360)
libc++abi.dylib: terminating with uncaught exception of type NSException

I tried calling FirebaseApp.configure() from inside didFinishLaunchingWithOptions and inside the init of AppDelegate as well:

override init() {
        super.init()

        // Setting up the firebase instance
        setupFirebase()
    }

private func setupFirebase() {

        FirebaseApp.configure()

        Messaging.messaging().delegate = self    
    }

It's crashing at this point - Screenshot 2020-03-18 at 8 10 39 PM

I am using import FirebaseCore & import FirebaseMessaging inside my AppDelegate

The Podfile.lock looks like this

Firebase/Core (6.20.0):
    - Firebase/CoreOnly
    - FirebaseAnalytics (= 6.3.1)
  - Firebase/CoreOnly (6.20.0):
    - FirebaseCore (= 6.6.4)
  - Firebase/Database (6.20.0):
    - Firebase/CoreOnly
    - FirebaseDatabase (~> 6.1.4)
  - Firebase/Firestore (6.20.0):
    - Firebase/CoreOnly
    - FirebaseFirestore (~> 1.11.2)
  - Firebase/Messaging (6.20.0):
    - Firebase/CoreOnly
    - FirebaseMessaging (~> 4.3.0)
  - FirebaseAnalytics (6.3.1):
    - FirebaseCore (~> 6.6)
    - FirebaseInstallations (~> 1.1)
    - GoogleAppMeasurement (= 6.3.1)
    - GoogleUtilities/AppDelegateSwizzler (~> 6.0)
    - GoogleUtilities/MethodSwizzler (~> 6.0)
    - GoogleUtilities/Network (~> 6.0)
    - "GoogleUtilities/NSData+zlib (~> 6.0)"
    - nanopb (= 0.3.9011)
  - FirebaseAnalyticsInterop (1.5.0)
  - FirebaseAuthInterop (1.1.0)
  - FirebaseCore (6.6.4):
    - FirebaseCoreDiagnostics (~> 1.2)
    - FirebaseCoreDiagnosticsInterop (~> 1.2)
    - GoogleUtilities/Environment (~> 6.5)
    - GoogleUtilities/Logger (~> 6.5)
  - FirebaseCoreDiagnostics (1.2.2):
    - FirebaseCoreDiagnosticsInterop (~> 1.2)
    - GoogleDataTransportCCTSupport (~> 2.0)
    - GoogleUtilities/Environment (~> 6.5)
    - GoogleUtilities/Logger (~> 6.5)
    - nanopb (~> 0.3.901)
  - FirebaseCoreDiagnosticsInterop (1.2.0)
  - FirebaseDatabase (6.1.4):
    - FirebaseAuthInterop (~> 1.0)
    - FirebaseCore (~> 6.0)
    - leveldb-library (~> 1.22)
  - FirebaseFirestore (1.11.2):
    - abseil/algorithm (= 0.20190808)
    - abseil/base (= 0.20190808)
    - abseil/memory (= 0.20190808)
    - abseil/meta (= 0.20190808)
    - abseil/strings/strings (= 0.20190808)
    - abseil/time (= 0.20190808)
    - abseil/types (= 0.20190808)
    - FirebaseAuthInterop (~> 1.0)
    - FirebaseCore (~> 6.2)
    - "gRPC-C++ (= 0.0.9)"
    - leveldb-library (~> 1.22)
    - nanopb (~> 0.3.901)
  - FirebaseInstallations (1.1.0):
    - FirebaseCore (~> 6.6)
    - GoogleUtilities/UserDefaults (~> 6.5)
    - PromisesObjC (~> 1.2)
  - FirebaseInstanceID (4.3.2):
    - FirebaseCore (~> 6.6)
    - FirebaseInstallations (~> 1.0)
    - GoogleUtilities/Environment (~> 6.5)
    - GoogleUtilities/UserDefaults (~> 6.5)
  - FirebaseMessaging (4.3.0):
    - FirebaseAnalyticsInterop (~> 1.5)
    - FirebaseCore (~> 6.6)
    - FirebaseInstanceID (~> 4.3)
    - GoogleUtilities/AppDelegateSwizzler (~> 6.5)
    - GoogleUtilities/Environment (~> 6.5)
    - GoogleUtilities/Reachability (~> 6.5)
    - GoogleUtilities/UserDefaults (~> 6.5)
    - Protobuf (>= 3.9.2, ~> 3.9)

Here's what the stack trace looks like:

 thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
    frame #0: 0x0000000195969ec4 libsystem_kernel.dylib`__pthread_kill + 8
    frame #1: 0x0000000195885774 libsystem_pthread.dylib`pthread_kill$VARIANT$mp + 112
    frame #2: 0x00000001957d9844 libsystem_c.dylib`abort + 100
    frame #3: 0x00000001959327d4 libc++abi.dylib`abort_message + 128
    frame #4: 0x00000001959329c4 libc++abi.dylib`demangling_terminate_handler() + 296
    frame #5: 0x000000019589a258 libobjc.A.dylib`_objc_terminate() + 124
    frame #6: 0x000000019593f304 libc++abi.dylib`std::__terminate(void (*)()) + 16
    frame #7: 0x000000019593ec58 libc++abi.dylib`__cxxabiv1::failed_throw(__cxxabiv1::__cxa_exception*) + 32
    frame #8: 0x000000019593ec18 libc++abi.dylib`__cxa_throw + 124
    frame #9: 0x000000019589a0d0 libobjc.A.dylib`objc_exception_throw + 356
    frame #10: 0x0000000195a66f84 CoreFoundation`+[NSException raise:format:] + 108
  * frame #11: 0x0000000107f993dc LocationTrackingFW`+[FIRInstallations installations](self=FIRInstallations, _cmd="installations") at FIRInstallations.m:159:5
    frame #12: 0x0000000107ab1bc0 LocationTrackingFW`+[FIRAnalytics updateFirebaseInstallationID] + 32
    frame #13: 0x0000000107ab1aec LocationTrackingFW`+[FIRAnalytics startWithConfiguration:options:] + 564
    frame #14: 0x00000001025cdac0 Field Service`-[FIRApp configureCore](self=0x0000000280a1b510, _cmd="configureCore") at FIRApp.m:364:9
    frame #15: 0x00000001025cd5e0 Field Service`+[FIRApp addAppToAppDictionary:](self=0x00000001035a2f20, _cmd="addAppToAppDictionary:", app=0x0000000280a1b510) at FIRApp.m:317:7
    frame #16: 0x00000001025cc90c Field Service`+[FIRApp configureWithName:options:](self=0x00000001035a2f20, _cmd="configureWithName:options:", name=@"__FIRAPP_DEFAULT", options=0x0000000280a1b750) at FIRApp.m:202:5
    frame #17: 0x00000001025cc330 Field Service`+[FIRApp configureWithOptions:](self=0x00000001035a2f20, _cmd="configureWithOptions:", options=0x0000000280a1b750) at FIRApp.m:145:3
    frame #18: 0x00000001025cc27c Field Service`+[FIRApp configure](self=0x00000001035a2f20, _cmd="configure") at FIRApp.m:131:3
    frame #19: 0x00000001022cb54c Field Service`AppDelegate.setupFirebase(self=0x0000000109f08a00) at AppDelegate.swift:272:21
    frame #20: 0x00000001022cb454 Field Service`AppDelegate.init() at AppDelegate.swift:42:9
    frame #21: 0x00000001022cb5e4 Field Service`@objc AppDelegate.init() at <compiler-generated>:0
    frame #22: 0x0000000199bda698 UIKitCore`UIApplicationMain + 1728
    frame #23: 0x00000001022d1af4 Field Service`main at AppDelegate.swift:21:7
    frame #24: 0x0000000195974360 libdyld.dylib`start + 4

Been stuck on this for hours now. Can anyone please help me out

user121095
  • 697
  • 2
  • 6
  • 18

4 Answers4

31

Firebase team member here. Most people who are running into this error have accidentally linked two copies of Firebase into their application, usually one in the app target and one in a dynamic framework dependency target. You can check if you have two copies of Firebase linked into your app by checking your runtime logs for duplicate class definition warnings. If you see warnings like

objc[40943]: Class FIRApp is implemented in both
~/Library/Developer/Xcode/DerivedData/FrameworkTest-apqjxlyrxvkbhhafhaypsbdquref/Build/Products/Debug-iphonesimulator/DynamicFramework.framework/DynamicFramework
(0x10b2a87f8) and
~/Library/Developer/CoreSimulator/Devices/4821F959-24A6-4D78-A102-4C5703103D99/data/Containers/Bundle/Application/F017D210-113A-4DAF-9E17-BDE455E71E06/FrameworkTest.app/FrameworkTest
(0x10ad2d348). One of the two will be used. Which one is undefined.

then that means you have two copies of Firebase in your app runtime. Previously this would not crash your app, but could lead to other undefined behavior like dropped Analytics events. We recently made a change in FirebaseInstallations that caused this to crash at launch. If you downgrade your Firebase version dependency, you will still have undefined behavior even if your app does not crash at launch.

Unfortunately, you'll either have to abandon the dynamic framework approach and link all dependencies directly into your app or you'll have to change your dynamic framework into a static one. In the future, we'll explore distributing Firebase as a dynamic dependency so that users can link it into dynamic frameworks without worry of duplicating class definitions at runtime.

See this doc on the Firebase iOS SDK GitHub for more details.

Edit: You can now choose to link Firebase either statically or dynamically via CocoaPods. See this document for more details: https://firebase.google.com/docs/ios/link-firebase-static-dynamic

Morgan Chen
  • 1,137
  • 7
  • 18
  • Great answer it. Yes, please work on dynamic dependency release and Carthage instead of Pods. – Dylan Jul 26 '20 at 04:54
  • in case if anyone doesn't know how to change dynamic third party swift packages to static, you can try the approach by duckduckgo/ios. Create static framework in your project and add all Swift Packages to it. Then use that framework in all your targets. – imthath Feb 09 '23 at 09:39
  • In case if you don't know how to remove dependency like me, follow this answer https://stackoverflow.com/a/75532024/1751166 and remove the firebase package you manually added. – PravyNandas Mar 01 '23 at 16:32
0

You don’t need to initialize it. According to Firebase doc check here

The setup required add GoogleService-Info.plist file and FirebaseApp.configure() in didFinishLaunchingWithOptions only and that’s it.

also, check this solution

  • Well it's crashing in `didFinishLaunchingWithOptions` as well. And the stack trace that I have attached above gets generated only when I add the code in `init()` of `AppDelegate` and not in case where I add it inside `didFinishLaunchingWithOptions ` – user121095 Mar 19 '20 at 09:15
  • are you added `GoogleService-Info.plist` file in App – Mohammed Elnaggar Mar 19 '20 at 09:17
  • Yeah. And verified the same whether it was actually locating and fetching data from it, it was. – user121095 Mar 19 '20 at 09:43
  • @user121095 can you share code in `didFinishLaunchingWithOptions` – Mohammed Elnaggar Mar 19 '20 at 09:47
  • It's the first line of code in `didFinishLaunchingWithOptions` and no other firebase SDK call is being performed inside `AppDelegate` – user121095 Mar 19 '20 at 10:07
  • @user121095 fixed? – Mohammed Elnaggar Mar 19 '20 at 21:59
  • No. I had to fallback to the previous version(6.15.0). Seems like there was some error with the updated version(6.20.0) as there were similar issues raised on the Firebase iOS SDK on [GitHub](https://github.com/firebase/firebase-ios-sdk/issues/5143) – user121095 Mar 20 '20 at 08:53
0

For my use case, I only wanted to use Firebase in my main project (not in my dynamic module).

The solution for me was to remove the Firebase dependencies from the dynamic module target.

I now have my dependencies separated like this.

def base
  pod 'RxSwift', '~> 5'
  pod 'RxCocoa', '~> 5'
  
  #//Add all your base pods here  
end

def fbase
  pod 'Firebase/Auth'
  pod 'FirebaseFirestoreSwift'
  pod 'Firebase/Functions'

  #//Add all your Firebase dependencies here
end

Then I have the following for each target

target 'My Main App Target' do
  base
  fbase

end

target 'My Dynamic module' do
  project './dynamic_module_path/dynamic_module.xcodeproj'
  
  base
end
Markymark
  • 2,804
  • 1
  • 32
  • 37
0

For my case [Flutter],

The issue was fixed when I uploaded the firebase file manually instead of using the flutterfire cli.

So instead of :

final FirebaseApp app = await Firebase.initializeApp(
  options: options,
);

use :

final FirebaseApp app = await Firebase.initializeApp();

and add the files manually.

Siyabonga
  • 11
  • 2