我们可以在 iOS 的后台线程上引导 Crashlytics 吗?

Posted

技术标签:

【中文标题】我们可以在 iOS 的后台线程上引导 Crashlytics 吗?【英文标题】:Can we bootstrap Crashlytics on a background thread on iOS? 【发布时间】:2017-10-18 00:58:54 【问题描述】:

我们正在尝试减少 ios 应用程序中的冷启动延迟,我们注意到 Crashlytics 可能需要 50 到 150 毫秒(在低端设备上)通过其 API 进行设置:

Fabric.with([Crashlytics.self])

这被指示在应用生命周期中尽早运行。

有没有人找到文档或尝试在后台队列中成功运行这段代码?

【问题讨论】:

【参考方案1】:

来自 Fabric 的 Mike。如果你在后台线程上初始化,你会冒着在应用程序启动时丢失崩溃的风险,所以从技术上讲你可以,但需要进行权衡。一般来说,在我的测试中,我看到一个 30-60 毫秒的初始化。

【讨论】:

是的,不错的主意 - 我想我们可以尝试在 Crashlytics 没有被引导的短暂时间内使用我们自己的基本崩溃报告器。 请注意,这将是有风险的,而且 iOS 仅支持一个正在运行的未捕获异常处理程序。 @MikeBonnell - 我在后台尝试引导时实际上遇到了一个静态分析错误 - [Crashlytics startWithAPIKey:..] 从后台线程调用的 UI API: - [UIApplication statusBarOrientation] 必须从仅限主线程。库是否调用了这个 API? @MikeBonnell 非常感谢您对其进行调查 - 但我看到的堆栈跟踪来自 Crashlytics 框架的方法 [CLSCrashReportingController captureInitialNotificationStates]。您可以查看我为 repro 制作的演示应用程序:github.com/michaelcueno/CrashlyticsTest - 您可以在 [UIApplication statusBarOrientation] 上设置符号断点或启用“主线程检查器”并暂停 Xcode 9 中的问题。感谢您这样做有帮助! @MikeBonnell - 我们看到了完全相同的行为,这就是让我来到这个线程的原因。 [CLSCrashReportingController captureInitialNotificationStates] 似乎在打电话给[UIApplication statusBarOrientation]【参考方案2】:

如果您实现 CrashlyticsDelegate 协议(特别是 crashlyticsDidDetectReportForLastExecution 回调)并将自己设置为委托,则 Crashlytics 将异步上传崩溃报告,因此您无需将初始化置于后台线程:

仅实现此委托方法将禁用所有形式的同步报告提交。这可能会影响在应用启动初期报告崩溃的可靠性。

https://docs.fabric.io/appledocs/Crashlytics/Protocols/CrashlyticsDelegate.html

【讨论】:

感谢您的建议 - 但我的延迟来自引导 Crashlytics - 而不是来自发送崩溃报告。除非之前发生过崩溃,否则在 crashlytics 初始化期间不会调用此方法。

以上是关于我们可以在 iOS 的后台线程上引导 Crashlytics 吗?的主要内容,如果未能解决你的问题,请参考以下文章

ios - 即使应用程序关闭,我也可以运行后台线程吗

主线程检查器:在后台线程上调用 UI API iOS 11 Xcode 9 GM Seed

无法从 iOS6 中的后台线程调用主线程上的代码

iOS:主线程检查器:在后台线程上调用的 UI API:-[UIView retainCount]

iOS:如何让后台线程在主线程上重绘视图

iOS - [UIImage initWithCGImage:scale:orientation:] 在后台线程上崩溃