为什么我的React原生应用在录制时在后台终止(iOS、RN 0.63.3、Expo-Av 9.2.3)

uubf1zoe  于 2023-03-19  发布在  React
关注(0)|答案(1)|浏览(89)

∮你好∮
我的React Native应用程序中出现了一个问题,当应用程序处于后台时,音频录制有时会神秘终止。
这种情况仅发生在记录后5到50分钟的可变时间量后的约1/10的用户会话中。
其他背景如下。
几周来我一直在想这个问题,但没有任何进展。如果你能想到是什么原因导致了这个问题,或者我应该在哪里进一步调查,我将不胜感激。

示例场景

1.释放模式用户在我们的应用程序中开始录音,导航到“正在录制”屏幕
1.用户返回iPhone主屏幕并锁定其手机。

  1. 5分钟后,用户打开屏面,确认橙子活动记录指示器在状态栏中仍然可见。
    1.又过了五分钟,用户打开屏幕,看到橙子活动录制指示灯不再可见(但这种情况大约只会发生10次中的1次)
    1.用户解锁手机并返回我们的应用程序。他们现在返回主屏幕而不是活动的录制屏幕。

既往调查:

  • Bugsnag在此会话期间没有未捕获的错误(也没有有用的线索)。这包括没有OOM错误的报告。
  • Crashlytics和Xcode Organizer的崩溃日志都没有显示在神秘终止的时间窗口中有任何崩溃。
  • 用户当天的Jetsam事件日志都没有提到我们的应用程序。

有关如何在我们的应用程序中进行录制的信息

  • 我们录制音频并将其以约100万个块的形式上传到我们的服务器。
  • 音频块在尝试上传之前保存到设备,并在成功上传后删除。
  • 我们使用ffmpeg来提取100万个音频块,而不停止我们的录制会话,以避免在后台暂停。

其他用户上下文

  • iPad和iPhone上都出现问题。不知道Android上是否出现。
  • 从iPhone 7到iPhone 14,新旧设备都出现问题。
  • 据用户传闻,此问题大多发生在低连接性环境中

环境

expo-env-info 1.0.2 environment info:
System:
OS: macOS 12.3
Shell: 5.8 - /bin/zsh
Binaries:
Node: 15.13.0 - ~/.nvm/versions/node/v15.13.0/bin/node
npm: 7.7.6 - ~/.nvm/versions/node/v15.13.0/bin/npm
Watchman: 2022.03.21.00 - /opt/homebrew/bin/watchman
Managers:
CocoaPods: 1.11.2 - /usr/local/bin/pod
SDKs:
iOS SDK:
Platforms: DriverKit 21.4, iOS 15.4, macOS 12.3, tvOS 15.4, watchOS 8.5
Android SDK:
API Levels: 23, 28, 29, 30, 31
Build Tools: 29.0.2, 30.0.2, 31.0.0
System Images: android-29 | Google Play ARM 64 v8a, android-30 | Google APIs Intel x86 Atom
IDEs:
Android Studio: 2020.3 AI-203.7717.56.2031.7935034
Xcode: 13.3/13E113 - /usr/bin/xcodebuild
npmPackages:
react: 16.13.1 => 16.13.1
react-native: 0.63.3 => 0.63.3
react-native-web: ^0.16.3 => 0.16.5
npmGlobalPackages:
expo-cli: 4.3.4
Expo Workflow: bare
mnemlml8

mnemlml81#

根本原因和解决方案

1)Mixpanel(爱死它们了!)iOS SDK有一个bug,偶尔会在30秒后导致后台终止。

对于上下文,Mixpanel使用后台任务在应用每次进入后台时将事件更新刷新到服务器。此外,iOS会在后台任务30秒后未完成时自动终止应用。
出于某种原因,这些Mixpanel事件刷新有时会超过30秒,导致应用终止。

2)后台内存不足终止。

当应用程序终止时,苹果几乎没有给出任何提示。使用Embrace.io(awesome company!),我能够开始从后台测量内存不足终止的发生率(BOOM)。
通过使用react原生工具进行分析,我发现即使在后台,响应Firestore侦听器的应用重新渲染和redux操作也会导致大量CPU使用。在进入后台时终止不必要的侦听器并卸载大多数屏幕,这使我们能够显著降低后台CPU使用,提高电池效率,并几乎消除BOOM
如果有人有具体的问题,我很乐意详细说明。在这个问题上花了很多时间。

相关问题