如何使用原生崩溃报告在 Swift 4 中实现异常/错误处理?

Posted

技术标签:

【中文标题】如何使用原生崩溃报告在 Swift 4 中实现异常/错误处理?【英文标题】:How to implement Exception/Error Handling in Swift 4 with native Crash Reporting? 【发布时间】:2019-01-11 07:51:32 【问题描述】:

我想在我的iOS Swift 4 代码中实现原生崩溃报告不推荐使用第三方库)并通知我当应用程序崩溃或产生任何异常时使用API调用的终端服务器。我发现 App Store / iTunes Connect 提供了崩溃次数,但它不提供崩溃信息,例如来自哪个 UIViewController 或由于哪个错误而崩溃。谁能帮我解决这个问题?提前致谢。

【问题讨论】:

这很难正确完成,并且很可能会在您的应用程序中引起重大问题(有比崩溃更糟糕的事情;我已经尝试构建其中之一)。在处理处于未定义状态的程序时,有许多不明显的极端情况。 (例如,您不能分配堆内存。)我强烈建议使用已建立的第三方崩溃收集器。如果您想管理自己的后端,PLCrashReporter 是一个开源解决方案。他们已经这样做了 10 年。你想要那种体验。 顺便说一句,您的意思不是“产生任何异常”。您的意思是“使您的应用程序崩溃的某些类型的未处理异常”。你真的只是说“崩溃”。 (即使是“异常”这个词也涵盖了 Cocoa 程序中至少四个不相关或稍微相关的事情。)这是迂腐的,但很关键,并且这种事情会导致本土的崩溃报告者破坏他们的应用程序。对于“异常”的几种含义之一,有几件事会产生您不想捕获的异常。如果你决定走这条路(例如学习),至少要学习 PLCrashReporter 作为基础。 【参考方案1】:

是的,您必须创建自定义崩溃报告管理器,并且可以使用NSSetUncaughtExceptionHandler 获取崩溃报告堆栈。

示例

NSSetUncaughtExceptionHandler  exception in

    print(exception)
    print(exception.callStackSymbols)

    // Write callStackSymbols into the file
    // Call your mail function with that file
    // mail()


let array = NSArray()
let element = array.object(at: 4)

您可以将该崩溃报告写入文件并邮寄。

【讨论】:

是否可以使用上述函数的崩溃数据进行 API 调用,而不是调用邮件函数? @iajmeri43 是的,您可以创建 .crash 文件并使用 API 将该文件发送到您的服务器 亲爱的 Sanjay 我正在尝试在我的项目 swift 4 中使用此代码,但我收到此错误:“无法从捕获上下文的闭包中形成 C 函数指针”。我该怎么办? @Niloufar 能否分享一下错误截图。【参考方案2】:

正如您所说,iTunes 仅提供崩溃次数,但不提供崩溃信息

实际上,XCode 本身会为您提供完整的崩溃细节,包括行号、设备信息、构建细节等。

在这里,我正在描述如何从 Xcode 获取崩溃的详细信息

    转到“窗口”-> xcode 中的“组织者”

    打开新窗口,从左侧应用列表中选择您的应用名称,然后从顶部段控件中选择 Crashes

    现在,您可以选择您想要的版本(即使您可以选择您在 testflight 上上传的 Beta 版本),一旦您选择版本,您将获得该版本的所有崩溃。您可以在下图中看到,它显示了设备的详细信息、线程的详细信息等。

    现在,如果您想前往发生崩溃的线路。只需将鼠标悬停在崩溃详细信息的粗线处,您将看到如下图所示的箭头按钮。单击该按钮后,Xcode 会将您重定向到项目中的相关行。

我认为,您现在已经清楚如何从实时应用中查看崩溃了。

【讨论】:

不错的答案,顺便说一句,我想通过 API 调用哪个控制器和或从哪个错误/异常引起的将它发送到我的后端服务器。希望你能满足我的要求。

以上是关于如何使用原生崩溃报告在 Swift 4 中实现异常/错误处理?的主要内容,如果未能解决你的问题,请参考以下文章

UIRefreshControl 在下拉时崩溃 - 未捕获的异常 Swift

这是如何在 swift 4 中实现的?

在 Swift 中实现 RCTEventEmitter 但未设置桥接异常

IQKeyboardManagerSwift pod install : 如何在 swift 中实现完成按钮操作

在 Swift 中实现哈希表?

在 Firebase 实时数据库中实现用户名(swift 4)