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

Posted

技术标签:

【中文标题】NativeScript 混合移动应用程序:跟踪/捕获崩溃【英文标题】:NativeScript Hybrid Mobile App: Tracking/Capturing Crashes 【发布时间】:2018-10-18 19:24:37 【问题描述】:

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

我遇到了this SO post,但它是在回答有关如何不让应用崩溃的问题时出现的。建议使用以下方法捕获崩溃事件:

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.androidargs.ios 中的任何内容。

如果上面不是正确的方法,那么有人可以帮我解决这个问题吗?

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

【问题讨论】:

github.com/danielgek/nativescript-sentry Sentry 可以很好地解决这个问题,还有其他几个用于包装原生 SDK 的 nativescript 日志记录选项。我想有人已经发布了一个 Fabric 插件,不确定。就个人而言,我在几个项目中使用哨兵,它工作得非常好,也很好的免费层。 感谢@BradMartin 的回复,感谢。我将检查该链接是否有哨兵。再次感谢! 编辑我用我发现的东西更新了我的问题。你怎么看? 【参考方案1】:

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

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

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

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

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

【讨论】:

Nathanael - 感谢您抽出时间来放下方法。高度赞赏!我确实考虑过,但我认为这将被视为一种处理此问题的旧方法。 [很好的网络错误,它没有来找我。我可能会在陷入那个循环之后做到这一点。 :) ] 我认为 NativeScript 会有一些东西(插件等)来做到这一点。我是 NativeScript 的新手,想看看社区在做什么。再次感谢您的详细回复,非常感谢。 有几个插件可以很容易地处理其中的一些;但它们是围绕服务设计的。我了解您希望将信息推送到您自己的服务器;所以在这种情况下,创建自己的插件来做这件事要简单得多。你只需要绑定onUncaughtError 函数和worker.onerror(如果使用workers)。 Nathanael - 成本肯定会起作用,但我认为我对提供此功能的插件持开放态度,这样我们就不会结束创建和管理这些数据。话虽如此,我认为此功能并未以我尝试的方式实现,并且最喜欢在内部完成。否则,我们现在应该已经收到回复了。 :) 再次感谢您的帮助,非常感谢。我会标记你的答案。 @Nathanael 你把这个错误处理逻辑放在哪里?在主app.component的构造函数里面?另外,我想知道如何测试这在本地是否有效。有没有手动触发崩溃的好方法?这些可能是添加到您的答案中的好东西。谢谢! 我了解到,当我尝试调用不存在的函数时,application.onUncaughtError 不会被调用。我只在调试控制台ERROR TypeError: _co.login2 is not a function 上收到错误消息。这是跟踪here 的已知问题。如何捕获这样的错误并将其发送到我的服务器?

以上是关于NativeScript 混合移动应用程序:跟踪/捕获崩溃的主要内容,如果未能解决你的问题,请参考以下文章

nativescript Vue中的指令和混合?

在 NativeScript 移动应用程序之间共享数据的方法

NativeScript官方书籍:1.为什么选择nativescript

文档重新:在 iOS 上混合 Web 和移动应用 Google Analytics ID?

关注 NativeScript+Angular 应用程序中的文本字段时,表单字段不会向上移动

我可以将我的 Web 应用程序 Vuejs 移动到 NativeScript-Vue 吗?