iosfirebaseswiftuilive-preview

Problems with Firebase and SwiftUI Live Previews


Since I added Firebase to my project Live Previews no longer work. Regular builds do work, just no live previews.

I tried following all of this answer solutions and comments with no luck (that question has the same errors although unrelated to SwiftUI).

Diagnostics:

linker command failed with exit code 1 (use -v to see invocation)


LinkDylibError: Failed to build UserViews.swift

Linking failed: linker command failed with exit code 1 (use -v to see invocation)

ld: warning: directory not found for option '-F/Applications/Xcode.app/Contents/SharedFrameworks-iphonesimulator'
Undefined symbols for architecture x86_64:
  "___llvm_profile_runtime", referenced from:
      ___llvm_profile_runtime_user in FirebaseCore(FIRAppAssociationRegistration.o)
      ___llvm_profile_runtime_user in FirebaseCore(FIRComponentType.o)
      ___llvm_profile_runtime_user in FirebaseCore(FIRConfiguration.o)
      ___llvm_profile_runtime_user in FirebaseCore(FIRCoreDiagnosticsConnector.o)
      ___llvm_profile_runtime_user in FirebaseCore(FIRDiagnosticsData.o)
      ___llvm_profile_runtime_user in FirebaseCore(FirebaseCore-dummy.o)
      ___llvm_profile_runtime_user in FirebaseCore(FIROptions.o)
      ...
     (maybe you meant: ___llvm_profile_runtime_user)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Solution

  • For now I have to temporarily disable Firebase (and GoogleSignIn) to work with SwiftUI's Live Previews.

    In my case I use Cocoapods, so I comment out the libraries from my Podfile:

    #  pod 'Firebase/Analytics'
    #  pod 'Firebase/Crashlytics'
    #  pod 'Firebase/Messaging'
    #  pod 'GoogleSignIn'
    

    Then $ pod install to temporarily remove them.

    And finally use #if canImport(Firebase) (and #if canImport(GoogleSignIn)) preprocessor macros where needed.

    #if canImport(Firebase)
    import Firebase
    #endif
    #if canImport(GoogleSignIn)
    import GoogleSignIn
    #endif
    
    // ...
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool
    {
        // ...
    
        #if canImport(Firebase)
        FirebaseApp.configure()
        #endif
    

    Not optimal, but until Xcode 12 fixes it or Google updates its frameworks no other way around it.