你好
我的React Native应用程序出现了一个问题,当应用程序处于后台时,录音有时会神秘地终止。
这种情况只发生在录制后5到50分钟的可变时间后的约1/10的用户会话中。
其他上下文如下。
几个星期以来,我一直在思考这个问题,没有取得任何进展。如果有任何关于是什么原因导致了这个问题,或者我应该在哪里进行进一步调查的想法,我们将不胜感激。
示例场景
-
发布模式用户在我们的应用程序中开始录音,导航到";记录进行中";屏幕
-
用户返回iPhone主屏幕并锁定手机。
-
五分钟后,用户打开屏幕,确认橙色活动录制指示灯在状态栏中仍然可见。
-
又过了五分钟。用户打开屏幕,看到橙色的活动录音指示器不再可见(但这种情况只发生大约1/10次(
-
用户解锁手机并返回我们的应用程序。它们现在返回到主屏幕,而不是活动录制屏幕。
先前调查:
- Bugsnag在会话期间没有为该用户捕获的错误(也没有有用的线索(。这不包括OOM错误的报告
- Crashlytics和Xcode Organizer的崩溃日志都没有显示在神秘终止的时间窗口内有任何崩溃
- 用户当天的Jetsam事件日志中没有提到我们的应用程序
关于录音如何在我们的应用程序中工作的信息
- 我们录制音频并将其以大约1m的块上传到服务器
- 音频块在尝试上传之前保存到设备,并在上传成功后删除
- 我们使用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
根本原因和解决方案
1( Mixpanel(爱他们!(iOS SDK有一个错误,偶尔会在30秒后导致后台终止
对于上下文,Mixpanel使用后台任务在每次应用程序进入后台时将事件更新刷新到服务器。此外,当后台任务在30秒后仍未完成时,iOS会自动终止应用程序。
出于某种原因,这些Mixpanel事件刷新有时超过30秒,导致应用程序终止。
2( 后台内存不足终止
当应用程序被终止时,苹果几乎没有给出任何提示。使用Embrace.io(很棒的公司!(,我能够开始从后台测量内存不足终止的发生率(BOOM(。
通过使用react本机工具进行分析,我能够发现,即使在后台,应用程序响应Firestore侦听器的重新渲染和redux操作也会导致大量CPU使用。在进入后台时终止不必要的侦听器并卸载大多数屏幕,使我们能够显著降低后台CPU使用率,提高电池效率,并实际上消除BOOM
如果有人有具体问题,我很乐意详细说明。在这个问题上花了很多时间。