1

我正在构建一个 NativeScript 移动应用程序,除此之外,我正在捕获用于分析目的的其他内容,我需要捕获可能包含错误/崩溃原因的“应用程序崩溃” 。

我遇到了这个 SO 帖子,但它是在一个关于如何不让应用程序崩溃的问题的回答中。建议使用以下方法捕获崩溃事件:

var application = require("application");

application.on(application.uncaughtErrorEvent, function (args) {
    if (args.android) {
        // For Android applications, args.android is an NativeScriptError.
        console.log("NativeScriptError: " + args.android);
    } else if (args.ios) {
        // For iOS applications, args.ios is NativeScriptError.
        console.log("NativeScriptError: " + args.ios);
    }
});

如果我按照上述方法进行,那么我有以下问题。如果有人可以确认这是否意味着每次应用程序崩溃都会生成此application.uncaughtErrorEvent事件,将不胜感激?我可以依靠它吗?如果这是真的,那么也许我可以对我的后端进行 REST 调用并存储日期、时间以及在args.androidor中的任何内容args.ios

如果上述方法不正确,那么有人可以帮助我如何去做吗?

非常感谢任何帮助。谢谢!

4

1 回答 1

3

application.onUncaughtError碰撞期间可能会在 95-98% 的时间内被击中;它非常可靠。我已经看到应用程序在没有任何通知的情况下崩溃了,但我不确定任何报告系统都可以处理那个问题。

我这样做的方式是在应用程序启动期间注册几件事:

  1. 我创建了一个global.error函数;这用于需要发送错误以进行远程记录的任何事物(如 try/catch、promise/catch)。所以在我的代码库中的任何地方我都可以做 aglobal.error(theError);并且它会被处理;这样我就不必担心在发生错误时尝试加载或要求东西,因为这可能会导致其他错误。
  2. 我使用该onUncaughtError事件来捕获通常未捕获的任何内容,然后通知用户发生错误并退出应用程序。(在这种情况下,不建议尝试恢复,因为您不知道错误是从哪里引发的......)
  3. 如果我使用工作线程,当我启动一个工作线程时,我会注册将worker.onerror其数据转发到主线程global.error函数,并且我有来自工作线程版本的特定消息,global.error它将错误发送回主线程。这样,如果工作人员自己调用 global.error ,则该消息将传递回主线程,然后传递给主线程上的 global.error ,它会正确处理所有内容。

这种技术让我能够捕捉到几乎所有可能发生的错误。主要global.error功能和onUncaughtError两者都使用我构建的简单报告库,如果设备在线,它将所有数据报告回我的一台服务器。如果设备处于离线状态,它可以选择将数据保存到报告文件以供以后上传;或者只是忽略它。

它还具有安全检查以验证错误不是网络错误(我们不希望错误报告进入循环,即尝​​试报告错误会导致错误,然后尝试报告错误;所以在事件是某种类型的网络错误;它会忽略那些。)

于 2018-05-10T09:05:14.893 回答