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.android
或 args.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 移动应用程序之间共享数据的方法
NativeScript官方书籍:1.为什么选择nativescript
文档重新:在 iOS 上混合 Web 和移动应用 Google Analytics ID?