在 ios 中反应本机崩溃而在后台 运行

react native crash in ios while running in background

我的应用与健身追踪器非常相似,我在 iphone 5s 和 5c 上重现了以下错误: 当我开始跟踪 运行 时,在某些情况下,应用程序会在 运行 在后台运行时被杀死。

条件好像是:

我设法获取了设备上的崩溃日志,并对报告进行了符号化,但它没有给我更多提示。它只是提到了通用的 react native js 和 ios 类 它收到错误的地方。

我正在使用 bugsnag 来收集崩溃报告,但在那种情况下它不会提交任何报告(可能是因为应用程序被杀死并且没有时间提交报告)。

谢谢!

崩溃日志中的有趣信息:

Exception Type:  EXC_CRASH (SIGKILL)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Termination Reason: Namespace <0xF>, Code 0x8badf00d
Triggered by Thread:  0

xcrun atos -arch arm64 -o appDsyms/4C682DF9-82D7-342C-ABC3-6218A1EED4F6.dSYM/Contents/Resources/DWARF/MyApp -l 0x100074000 0x000000010007b2bc 0x00000001001452f4 0x0000000100145318 0x00000001000aba84

main (in MyApp) (main.m:16)
ksmachexc_i_handleExceptions (in MyApp) (KSCrashSentry_MachException.c:237)
ksmachexc_i_handleExceptions (in MyApp) (KSCrashSentry_MachException.c:233)
+[RCTJSCExecutor runRunLoopThread] (in MyApp) (RCTJSCExecutor.mm:211)

complete crash log

我花了很长时间才明白发生了什么。永远无法从 crashlogs 或 bugsnag 中得到任何东西。

不得不用 XCode 长时间分析它以了解发生了什么:我有内存泄漏。如果您的应用程序使用过多内存,并且 运行 在后台运行,在某些时候 iOS 会将其视为有害应用程序并简单地终止它。

问题

简而言之,问题是 UI 上的 gps 坐标检索和更新显示(我计算所用距离、平均速度和其他分析)受到限制。

因此在 UI 上没有更新时,redux 操作在后台触发。最重要的是,我将 gps 坐标存储在 redux 存储中,一段时间后,它包含在一个巨大的数组中。这导致了很多不必要的处理+愚蠢的内存使用。

修复

我通过将它们分开来修复它

  • gps坐标的检索和存储(只是将坐标存储在AsyncStorage中,没有计算动作)

  • UI 的更新:每秒更新一次计时器,计算所花费的时间 + 每 2 秒检查一次我是否有新的 gps 坐标,如果有则计算分析

结果

CPU 当应用程序处于活动状态时,内存使用量会显着减少,这仅仅是因为我停止使用 redux 来存储大量数据(它不是为了存储你的 UI 状态).

CPU 当应用程序处于后台时,内存使用量变得完全平坦,因为我只存储东西。

所以我对这个主题有了新的了解!.. 聪明点,分开关注.. 长期的个人资料。如果您有任何内存泄漏,请考虑您存储数据的位置和频率。如果您的应用程序在后台运行,请尽可能限制在此阶段发生的事情(避免 redux 更新,避免计算,存储以备后用)