NativeScript混合移动应用程序:跟踪/捕获崩溃

NativeScript混合移动应用程序:跟踪/捕获崩溃,nativescript,angular2-nativescript,crash,nativescript-angular,nativescript-plugin,Nativescript,Angular2 Nativescript,Crash,Nativescript Angular,Nativescript Plugin,我正在构建一个NativeScript移动应用程序,为了分析的目的,我需要捕获“应用程序崩溃”,可能有错误/崩溃的原因 我遇到了一个问题,就是如何避免应用程序崩溃。以下建议用于捕捉碰撞事件: var application = require("application"); application.on(application.uncaughtErrorEvent, function (args) { if (args.android) { // For Android

我正在构建一个NativeScript移动应用程序,为了分析的目的,我需要捕获“应用程序崩溃”,可能有错误/崩溃的原因

我遇到了一个问题,就是如何避免应用程序崩溃。以下建议用于捕捉碰撞事件:

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);
    }
});
如果我按照上面的话,那么我有以下问题。如果有人能确认这是否意味着每次应用程序崩溃时都会生成此
应用程序。uncaughtErrorEvent
事件,我们将不胜感激?我可以信赖它吗? 如果这是真的,那么也许我可以对我的后端进行REST调用,并存储日期、时间以及
args.android
args.ios
中的任何内容

如果上述方法不正确,那么有人能帮我做这件事吗


非常感谢您的帮助。谢谢大家!

在崩溃过程中,
应用程序.onUncaughtorror
可能会被命中95-98%;它相当可靠。我已经看到应用程序在没有任何通知的情况下崩溃了,它只是发出砰砰声,但我不确定任何报告系统都能处理这个问题

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

  • 我创建了一个
    global.error
    函数;这用于需要发送错误以远程记录的任何内容(如try/catch、promise/catch)。所以在我的代码库中的任何地方我都可以做一个
    global.error(theError)并将对其进行处理;这样,我就不必担心在发生错误时尝试加载或要求某些东西,因为这可能会导致其他错误
    
  • 我使用
    onuncaughtror
    事件捕获通常未捕获的任何内容,然后通知用户发生错误并退出应用程序。(在这种情况下,不建议尝试恢复,因为您不知道错误从何处抛出…)
  • 如果我使用一个工作线程,当我启动一个工作线程时,我注册
    worker.onerror
    将其数据转发到主线程
    global.error
    函数,并且我有一条来自工作线程版本的
    global.error
    的特定消息,它将错误发送回主线程。这样,如果工作线程本身调用global.error,则该消息将传回主线程,然后传回主线程上的global.error,该线程将正确处理所有内容
  • 这种技术允许我捕获几乎所有可能发生的错误。主
    global.error
    函数和
    onuncaughtror
    都使用我构建的简单报告库,如果设备在线,它会将所有数据报告回我的一台服务器。如果设备处于脱机状态,它可以选择将数据保存到报告文件中,以便稍后上载;或者干脆忽略它


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

    Sentry对此很有效,包装本机SDK的nativescript还有几个其他日志记录选项。我想有人已经发布了一个Fabric插件,不确定。就我个人而言,我在几个项目中使用了sentry,效果非常好,免费层也不错。谢谢回复@BradMartin,谢谢。我会检查哨兵的链接。再次感谢!编辑我已经用我找到的东西更新了我的问题。你觉得怎么样?纳撒尼尔-谢谢你抽出时间来放下这个方法。非常感谢!我确实想过,但我认为这将被视为一种古老的处理方式。[很好地抓住了网络错误,我没有想到。我可能会在陷入那个循环后再做。:]我想NativeScript会有一些东西(插件等)来做这件事。我是NativeScript的新手,想看看社区正在做什么。再次感谢您的详细回复,非常感谢。有几个插件可以很容易地处理其中的一些问题;但它们是围绕服务而设计的。我知道你想把信息推送到你自己的服务器上;因此,在这种情况下,创建自己的插件来实现这一点更简单。你只需要将
    onuncughterror
    函数和worker.onerror(如果使用workers.nathanel)结合起来,成本肯定会起到一定作用,但我认为我愿意使用提供此功能的插件,这样我们就不会停止创建和管理此数据。话虽如此,我认为这个功能并没有以我正在尝试的方式实现,而且最喜欢在内部实现。否则,我们现在可能已经收到答复了。:)再次感谢您的帮助,非常感谢。我会把你的答案记下来。@Nathanel你把这个错误处理逻辑放在哪里了?在主
    应用程序组件的构造函数内部
    ?另外,我想知道如何测试这是否在本地工作。是否有一种手动触发崩溃的好方法?这些可能是补充你答案的好东西。非常感谢。我了解到当我试图调用一个不存在的函数时,
    application.onuncaughtror
    不会被调用。我只在调试控制台上得到一个错误
    错误类型错误:_co.login2不是一个函数
    。这是一个已知的问题。如何捕获这样的错误并将其发送到服务器?