firebase / firebase-ios-sdk

Firebase SDK for Apple App Development
https://firebase.google.com
Apache License 2.0
5.47k stars 1.43k forks source link

Can't render SwiftUI canvas with Code Coverage Enabled #6219

Closed brandtdaniels closed 3 years ago

brandtdaniels commented 3 years ago

Step 0: Are you in the right place?

[REQUIRED] Step 1: Describe your environment

[REQUIRED] Step 2: Describe the problem

Can't render SwiftUI canvas due to FirebaseCore

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

----------------------------------------

LinkDylibError: Failed to build TemplateListView.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(FIRComponentType.o)
      ___llvm_profile_runtime_user in FirebaseCore(FIRConfiguration.o)
      ___llvm_profile_runtime_user in FirebaseCore(FIRDiagnosticsData.o)
      ___llvm_profile_runtime_user in FirebaseCore(FirebaseCore-dummy.o)
      ___llvm_profile_runtime_user in FirebaseCore(FIRAnalyticsConfiguration.o)
      ___llvm_profile_runtime_user in FirebaseCore(FIRBundleUtil.o)
      ___llvm_profile_runtime_user in FirebaseCore(FIRAppAssociationRegistration.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)

Steps to reproduce:

Rendering SwiftUI Canvas. The current workaround is to disable code coverage in the build scheme

Relevant Code:

NA

google-oss-bot commented 3 years ago

I couldn't figure out how to label this issue, so I've labeled it for a human to triage. Hang tight.

paulb777 commented 3 years ago

A reproducible example would help us to diagnose

brandtdaniels commented 3 years ago

Any SwiftUI examples seems to reproduce the issue. Here are some SO posts regarding the issue:

https://stackoverflow.com/questions/60440074/problems-with-firebase-and-swiftui-live-previews

This workaround worked my project: https://stackoverflow.com/a/62355502/699002 which references this tweet: https://twitter.com/dannypier/status/1190312160557068293

paulb777 commented 3 years ago

I suspect that solving #2022 may resolve this. Until then, the workarounds may be the best bet.

paulb777 commented 3 years ago

Also may be related this issue noted at https://forums.swift.org/t/swift-packages-in-multiple-targets-results-in-this-will-result-in-duplication-of-library-code-errors/34892/38:

There is an entirely separate issue which happens only for Xcode previews which is related to all package products being built dynamically in Xcode 12 to enable previews. It is also something we're actively investigating. There is no workaround for this, since users do not have control over how builds for preview are being done.

paulb777 commented 3 years ago

Does Xcode 12 beta 5 make any difference?

StormKop commented 3 years ago

Unfortunately it does not Xcode 12 beta 5 does not fix the issue.

ryanwilson commented 3 years ago

I was able to reproduce this issue and the workaround works for me as well.

Steps to reproduce:

  1. Create a new SwiftUI iOS project in Xcode 12 b6. *Make sure to check the "Include Tests" box. Close the Xcode window.
  2. cd into the directory, run pod init.
  3. Add pod 'FirebaseCore' to the Podfile.
  4. Run pod update.
  5. Open the .xcworkspace generated from CocoaPods.
  6. Edit the scheme of the main app: go to the "Test" section, Options, click the Code Coverage checkbox.
  7. In ContentView.swift, add import FirebaseCore and replace the contents of body with:
var body: some View {
    Text("Hello, world!")
      .padding()
      .onAppear {
        // Use some arbitrary calls from `FirebaseCore`
        if let defaultApp = FirebaseApp.app() {
          print("Firebase configured! \(defaultApp.name)")
        } else {
          print("Firebase not configured.")
        }
      }
  }
  1. Regenerate the SwiftUI Preview Canvas. Observe the failure.
ryanwilson commented 3 years ago

@brandtdaniels hope you don't mind that I changed the title to make it easier to find for folks, and more accurately state the issue. Thanks again for the report.

ryanwilson commented 3 years ago

TODO: Attempt to reproduce with Firebase 7, since dynamic frameworks are now used. Also check with Xcode 12.2 release candidate to see if the Xcode issue is resolved with static frameworks.

brandtdaniels commented 3 years ago

Any updates on this?

atereshkov commented 3 years ago

Same for me. Still an issue

denisaionita commented 3 years ago

This is still an issue, it's most likely an Apple bug as I have found a few related issues on their forum, with weird workarounds(remove arm64 which was already done, validate workspace, set Build Active Architecture Only" to No and other such. Nothing worked or made sense for me and my project, and going through this thread I tried disabling the code coverage capability for my main scheme - and weirdly enough, that made the previews render.

markst commented 3 years ago

Also an issue for me. Disabling the code coverage does not appear to resolve.

tichise commented 3 years ago

I am now getting previews rendered with code coverage off.

teh-nsd commented 3 years ago

I had the same issue with Canvas previews and can confirm that after I turned off Code coverage they now work.

ryanwilson commented 3 years ago

TODO: Test this issue with Xcode 12.5 to see if it's resolved.

ryanwilson commented 3 years ago

Hey everyone, I tested this with Xcode 12.5 with my repro steps above and was unable to reproduce - I think this is resolved.

I'm going to close this now, but if you still see the same error using Xcode 12.5 please share steps to reproduce and I'll re-open the issue!