firebase-ios-sdk icon indicating copy to clipboard operation
firebase-ios-sdk copied to clipboard

SwiftUI Previews crashes on FBLPromise with unrecognized selector

Open simba909 opened this issue 4 years ago • 14 comments
trafficstars

[REQUIRED] Step 1: Describe your environment

  • Xcode version: 12.5
  • Firebase SDK version: 7.8.1 or 7.11
  • Installation method: Zip file
  • Firebase Component: Analytics, Database, Firestore, Storage

[REQUIRED] Step 2: Describe the problem

With Firebase set up in an iOS app, I cannot run SwiftUI Previews (and just previewing itself crashes frequently). Running the app in a simulator / on a device is fine and doesn't generate any warnings or errors in the Xcode console output.

This looks very similar to what was reported in #7939, but we're using the Zip distribution and it only affects SwiftUI previews.

This can be reproduced with a minimal sample app:

Steps to reproduce:

  • Set up a new Xcode project for iOS
  • Set up a Firebase project for the app to get a GoogleService-Info.plist
  • Add Firebase 7.11 (or 7.8.1, both have the same issue) from the zip distribution with the following SDKs:
    • FirebaseAnalytics
    • FirebaseDatabase
    • FirebaseFirestore
    • FirebaseStorage
  • Add import FirebaseCore and FirebaseApp.configure() to the AppDelegate as the zip readme instructs
  • Add a SwiftUI view (if the project isn't SwiftUI already)
  • Resume the SwiftUI Preview in Xcode (this might already trigger the issue, might not)
  • If the issue hasn't been triggered by the step above, click the little "Run" button in the Preview Canvas and watch the preview immediately crash

Log from Console.app:

Process:               MyApp [18188]
Path:                  <redacted>
Identifier:            MyApp
Version:               1.0 (1)
Code Type:             ARM-64 (Native)
Parent Process:        launchd_sim [70680]
Responsible:           SimulatorTrampoline [14098]
User ID:               501

Date/Time:             2021-04-29 11:28:37.611 +0200
OS Version:            macOS 11.3 (20E232)
Report Version:        12
Anonymous UUID:        <redacted>

Sleep/Wake UUID:       <redacted>

Time Awake Since Boot: 120000 seconds
Time Since Wake:       15000 seconds

System Integrity Protection: enabled

Crashed Thread:        7  Dispatch queue: com.google.GDTCCTUploader

Exception Type:        EXC_CRASH (SIGABRT)
Exception Codes:       0x0000000000000000, 0x0000000000000000
Exception Note:        EXC_CORPSE_NOTIFY

Application Specific Information:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[FBLPromise HTTPBody]: unrecognized selector sent to instance 0x600001ea4720'
terminating with uncaught exception of type NSException
abort() called
CoreSimulator 757.5 - Device: iPhone 12 Pro (4631766E-9C43-461C-8EB6-2B639CEE6CB0) - Runtime: iOS 14.5 (18E182) - DeviceType: iPhone 12 Pro

Application Specific Backtrace 1:
0   CoreFoundation                      0x0000000104599978 __exceptionPreprocess + 236
1   libobjc.A.dylib                     0x0000000103719800 objc_exception_throw + 56
2   CoreFoundation                      0x00000001045a8f14 +[NSObject(NSObject) instanceMethodSignatureForSelector:] + 0
3   CoreFoundation                      0x000000010459dbf0 ___forwarding___ + 1408
4   CoreFoundation                      0x000000010459fe7c _CF_forwarding_prep_0 + 92
5   MyApp                               0x0000000102ab0024 -[GDTCCTUploadOperation updateNextUploadTimeWithResponse:forTarget:] + 64
6   MyApp                               0x0000000102aaf8d0 __64-[GDTCCTUploadOperation sendURLRequestWithBatch:target:storage:]_block_invoke + 76
7   MyApp                               0x0000000102aac514 __56-[FBLPromise chainOnQueue:chainedFulfill:chainedReject:]_block_invoke.48 + 52
8   libdispatch.dylib                   0x0000000109f4a580 _dispatch_call_block_and_release + 24
9   libdispatch.dylib                   0x0000000109f4bd44 _dispatch_client_callout + 16
10  libdispatch.dylib                   0x0000000109f52dcc _dispatch_lane_serial_drain + 968
11  libdispatch.dylib                   0x0000000109f537f8 _dispatch_lane_invoke + 400
12  libdispatch.dylib                   0x0000000109f5da58 _dispatch_workloop_worker_thread + 744
13  libsystem_pthread.dylib             0x00000001bca3b754 _pthread_wqthread + 272
14  libsystem_pthread.dylib             0x00000001bca3a524 start_wqthread + 8

Thread 0:: Dispatch queue: com.apple.main-thread
0   libsystem_kernel.dylib        	0x00000001bc9fe470 mach_msg_trap + 8
1   libsystem_kernel.dylib        	0x00000001bc9fe814 mach_msg + 72
2   com.apple.CoreFoundation      	0x000000010450783c __CFRunLoopServiceMachPort + 368
3   com.apple.CoreFoundation      	0x0000000104501d3c __CFRunLoopRun + 1136
4   com.apple.CoreFoundation      	0x00000001045013bc CFRunLoopRunSpecific + 572
5   com.apple.GraphicsServices    	0x0000000114dc770c GSEventRunModal + 160
6   com.apple.UIKitCore           	0x000000010e0eb3d0 -[UIApplication _run] + 964
7   com.apple.UIKitCore           	0x000000010e0f01ac UIApplicationMain + 112
8   libswiftUIKit.dylib           	0x0000000109cf316c UIApplicationMain(_:_:_:_:) + 100
9   com.example.MyApp              	0x0000000102aa3294 static UIApplicationDelegate.main() + 120
10  com.example.MyApp              	0x0000000102aa320c static AppDelegate.$main() + 108 (AppDelegate.swift:11)
11  com.example.MyApp              	0x0000000102aa332c main + 32
12  libdyld.dylib                 	0x0000000109fdd554 start + 4

simba909 avatar Apr 29 '21 09:04 simba909

I found a few problems with this issue:

  • I couldn't figure out how to label this issue, so I've labeled it for a human to triage. Hang tight.
  • This issue does not seem to follow the issue template. Make sure you provide all the required information.

google-oss-bot avatar Apr 29 '21 09:04 google-oss-bot

Same here. Did you manage to sort this out @simba909? I am not using Firestore or The realtime database, but do use analytics and storage.

sipersso avatar May 16 '21 19:05 sipersso

@sipersso Unfortunately we have not, although I haven't had too much time to spend on it. Curiously this doesn't seem to happen when importing Firebase with SPM, but that (at the moment? 🙏🏻 ) requires us to build from source every time we build the project which isn't feasible

simba909 avatar May 17 '21 06:05 simba909

Thanks for the reply @simba909 I haven't been able to figure out any workarounds for it either. Makes any development using SwiftUI impossible :/

Using SPM isn't an option for me yet since google sign in is still not supported.

sipersso avatar Jun 02 '21 19:06 sipersso

Is -ObjC added to Other Linker Options? Bullet 8 in the Zip Readme instructions.

paulb777 avatar Jun 02 '21 19:06 paulb777

@paulb777 I use cocoapods, but I’ll check the flag

sipersso avatar Jun 02 '21 20:06 sipersso

@paulb777 for cocoapods I was able to get rid of the errors by switching from static to dynamic linking ( removing the :linkage => :static from the podfile).

sipersso avatar Jun 03 '21 05:06 sipersso

@paulb777 Yes, it's added. I've taken the time this morning to set up a minimal sample project that reproduces this issue: https://github.com/simba909/FirebaseIssue8005

See the readme for more info, but the gist of it is:

  • Clone the project
  • Add a Google-Info.plist for a Firebase project
  • Open ContentView.swift
  • Try to resume and then "Play" the live preview, and the preview should crash

simba909 avatar Jun 03 '21 09:06 simba909

@simba909 Thanks for the great repro. I'm able to reproduce. Unfortunately, I don't have any immediate solutions. It really looks like a bug with SwiftUI Preview.

Some possible next steps:

  • Report the issue as is to Apple
  • Try to reduce the crash to only Promises and fewer clients
  • Follow up on Promises support channels
  • Experiment with forcing linkage to the missing symbols from other libraries or the main app

paulb777 avatar Jun 03 '21 23:06 paulb777

Closing for staleness. If this is still occurring, please comment or open another issue.

paulb777 avatar Mar 18 '22 23:03 paulb777

This is unfortunately still an issue, just tested with Xcode 13.3 and Firebase 8.14.0 and can still reproduce. As of Xcode 13.3 there's no longer a need to go looking for error logs, they open immediately when trying to preview ContentView.swift in the sample project (which I've also updated, now importing Firebase via SPM).

simba909 avatar Mar 30 '22 17:03 simba909

Are there any updates or "simpler" fixes to get around this? Sadly, it's still possible to reproduce the issue for projects targeting iOS 13 on Xcode 13.3.1.

Oskarzito avatar May 18 '22 08:05 Oskarzito

Opened https://github.com/google/promises/issues/189 to explore a Promises fix

paulb777 avatar Jun 17 '22 14:06 paulb777

Kind of weird behavior when I run https://github.com/simba909/FirebaseIssue8005 with Xcode 13.4. I reproduced the Promises crash on the first preview, but then after closing the diagnostic window, the preview started working.

The crash reproduces consistently with Xcode 14.0 beta 2.

Also, I'm only able to reproduce the issue with binary distributions. Does anyone have a repro case with a source distribution?

paulb777 avatar Jun 24 '22 23:06 paulb777

Using Xcode 14.2, iOS 16.2 simulator, Firebase SDK 8.10.0 via Carthage, this issue is reproducible. Crash log is exactly the same as reported.

The strange thing is, it worked quite fine for 2 days, then it started crashing. Now it's not working at all, crashing immediately.

I'm hoping for a resolution to this 2 year old, reproducible issue.

b-onc avatar May 31 '23 13:05 b-onc

Is this happening in live previews as well?

ncooke3 avatar Jul 17 '23 15:07 ncooke3

Is this happening in live previews as well?

Yes

mikchmie avatar Jul 17 '23 16:07 mikchmie

This should be addressed in Promises 2.3.1 that is planned to be shipped with the Firebase 10.13.0 binary distributions

paulb777 avatar Jul 25 '23 17:07 paulb777