Firebase 应用配置崩溃

Posted

技术标签:

【中文标题】Firebase 应用配置崩溃【英文标题】:Firebase App configuration crash 【发布时间】:2016-10-24 18:35:30 【问题描述】:

我有一个使用 Firebase 进行分析的 ios 自定义键盘。 Firebase 应用程序配置在初始化程序中使用 dispatch_once 子句完成,令牌作为全局变量。

var token: dispatch_once_t = 0

class KeyboardViewController: UIInputViewController 
// ..
  override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) 
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    dispatch_once(&token) 
        FIRApp.configure()
     // line 90
  
// ..

这工作正常,但我收到许多崩溃报告,表明在配置应用程序时许多设备上发生了崩溃。我被困了好几天试图找出原因。以下是其中一个崩溃报告堆栈跟踪的一部分:

Exception Type:  EXC_CRASH (SIGQUIT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Termination Signal: Quit: 3
Termination Reason: Namespace SIGNAL, Code 0x3
Terminating Process: launchd [1]
Triggered by Thread:  0

Thread 0 name:
Thread 0 Crashed:
0   libsystem_kernel.dylib          0x000000018fab6338 __semwait_signal_nocancel + 8
1   libsystem_c.dylib               0x000000018f9e20dc nanosleep$NOCANCEL + 200 (nanosleep.c:104)
2   libsystem_c.dylib               0x000000018fa0568c sleep$NOCANCEL + 44 (sleep.c:62)
3   libsystem_dnssd.dylib           0x000000018fa6e7d4 ConnectToServer + 832 (dnssd_clientstub.c:607)
4   libsystem_dnssd.dylib           0x000000018fa6ff44 DNSServiceCreateConnection + 76 (dnssd_clientstub.c:1785)
5   libsystem_network.dylib         0x000000018fb2d318 __nw_resolver_set_update_handler_block_invoke + 872 (resolver.m:1031)
6   libdispatch.dylib               0x000000018f9711c0 _dispatch_client_callout + 16 (object.m:455)
7   libdispatch.dylib               0x000000018f97e860 _dispatch_barrier_sync_f_invoke + 84 (queue.c:3457)
8   libsystem_network.dylib         0x000000018fb2ce78 nw_resolver_set_update_handler + 208 (resolver.m:1275)
9   SystemConfiguration             0x0000000190f8a16c __SCNetworkReachabilityRestartResolver + 260 (SCNetworkReachability.c:1711)
10  SystemConfiguration             0x0000000190f891c8 __SCNetworkReachabilitySetDispatchQueue + 764 (SCNetworkReachability.c:1823)
11  SystemConfiguration             0x0000000190f88ccc SCNetworkReachabilityScheduleWithRunLoop + 504 (SCNetworkReachability.c:1586)
12  CustomKeyboard              0x000000010013f630 -[FIRReachabilityChecker start] + 196
13  CustomKeyboard              0x000000010013abac -[FIRNetwork init] + 156
14  CustomKeyboard              0x0000000100132e28 -[FIRClearcutLogger init] + 416
15  CustomKeyboard              0x0000000100132c68 __35+[FIRClearcutLogger sharedInstance]_block_invoke + 36
16  libdispatch.dylib               0x000000018f9711c0 _dispatch_client_callout + 16 (object.m:455)
17  libdispatch.dylib               0x000000018f971fb4 dispatch_once_f + 56 (once.c:57)
18  CustomKeyboard              0x0000000100132c40 +[FIRClearcutLogger sharedInstance] + 108
19  CustomKeyboard              0x0000000100137214 +[FIRApp initClearcut] + 60
20  CustomKeyboard              0x0000000100136688 +[FIRApp configureDefaultAppWithOptions:sendingNotifications:] + 132
21  CustomKeyboard              0x000000010013643c +[FIRApp configure] + 316
22  libdispatch.dylib               0x000000018f9711c0 _dispatch_client_callout + 16 (object.m:455)
23  libdispatch.dylib               0x000000018f971fb4 dispatch_once_f + 56 (once.c:57)
24  CustomKeyboard              0x00000001000e314c _TFC19CustomKeyboard22KeyboardViewControllercfT7nibNameGSqSS_6bundleGSqCSo8NSBundle__S0_ + 1500 (KeyboardViewController.swift:90)
25  CustomKeyboard              0x00000001000e3270 _TToFC19CustomKeyboard22KeyboardViewControllercfT7nibNameGSqSS_6bundleGSqCSo8NSBundle__S0_ + 112 (KeyboardViewController.swift:0)
26  UIKit                           0x00000001971f7688 -[_UIViewServiceViewControllerOperator __createViewController:withContextToken:fbsDisplays:appearanceSerializedRepresentations:legacyAppearance:traitCollection:initialInterfaceOrientation:hostAccessibilityServerPort:canShowTextServices:replyHandler:] + 2216 (UIViewServiceViewControllerOperator.m:1732)
27  CoreFoundation                  0x0000000190aee160 __invoking___ + 144
28  CoreFoundation                  0x00000001909e1c3c -[NSInvocation invoke] + 284 (NSForwarding.m:2948)
29  CoreFoundation                  0x00000001909e66ec -[NSInvocation invokeWithTarget:] + 60 (NSForwarding.m:3019)

显然,调用FIRApp.configure() 后的调用跟踪正在通过系统库。

堆栈跟踪的一个观察结果是,崩溃与检查设备的可达性有关。但是,我尝试重现没有互联网连接但工作正常的场景。

请注意,所有崩溃都发生在 iOS 10 上,其中大部分发生在 iPhone 6 上。

任何帮助找出崩溃的原因将不胜感激。

【问题讨论】:

您说的是“自定义键盘”。您是否在扩展程序中使用 Firebase Analytics?除了 10 之外的其他 iOS 上是否发生过这种情况? 是的,我正在扩展中使用 FB Analytics。除了 iOS 10 以外的任何 iOS 版本中都没有出现 id。 感谢您向我们提供信息。我们将深入研究这个问题。 【参考方案1】:

不建议在扩展中使用 Firebase Analytics,因为 SDK 不能很好地支持扩展。与完整应用相比,应用扩展的功能有限,因此 Firebase Analytics 在某些情况下可能无法正常运行,例如本例中的网络。该团队正在考虑稍后更好地支持扩展。

Apple 声明的自定义键盘上似乎无法使用网络

"默认情况下,键盘没有网络访问权限,不能共享 容器及其包含的应用程序。要启用这些功能,请设置 Info.plist 文件中 RequestsOpenAccess 布尔键的值 是的。这样做会扩展键盘的沙箱,如中所述 为用户信任而设计。”

https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/CustomKeyboard.html#//apple_ref/doc/uid/TP40014214-CH16-SW1

【讨论】:

感谢 Alex D 的回复。我们正在使用 FB Analytics 来跟踪一些感兴趣的事件。我希望 FB 团队更好地支持扩展。请注意,我已经有RequestsOpenAccess sat。 感谢您提供更多信息。我猜即使您在 Info.plist 中设置了 RequestsOpenAccess,Firebase Analytics 中的一些底层库也无法在扩展上运行。 我使用 Firebase Analytics SDK 创建了一个键盘扩展,并尝试在 iPhone 6 iOS 10 上运行它。据我所知(使用 RequestOpenAccess)它运行良好。我不知道你的实现和我的有什么区别。我所做的是在调用通知 UIApplicationDidFinishLaunchingNotification 时调用 FIRApp.configure()。 我们在运行 iOS 11.3 和 11.4 的 iPhone 和 iPad 上经常遇到相同类型的崩溃。我们的应用也是一个自定义键盘应用,RequestsOpenAccess 设置为 true。

以上是关于Firebase 应用配置崩溃的主要内容,如果未能解决你的问题,请参考以下文章

使用选项配置 firebase 在 Xcode 11 和 Firebase 6.19 中崩溃

FirebaseApp.configure() 在启动时使应用程序崩溃

应用程序崩溃 [FIRApp appWasConfiguredTwice:usingOptions:]

firebase 配置崩溃

由于 Firebase 初始化,App Delegate 崩溃

将 GeoFire 查询加载到 RecyclerView 时应用程序崩溃