为什么我的本机反应应用程序在录制时在后台终止(iOS,RN 0.63.3,Expo-Av 9.2.3)
Why is my react-native app terminating in the background while recording (iOS, RN 0.63.3, Expo-Av 9.2.3)
你好
我的 React Native 应用程序出现问题,当应用程序处于后台时,录音有时会莫名其妙地终止。
这种情况只发生在大约 1/10 的用户会话中,在录制开始后 5 到 50 分钟不等的不同时间段之后。
更多上下文如下。
几周来我一直在努力解决这个问题,但没有任何进展。对于可能导致此问题的原因或我应该在何处进一步调查的任何想法,我们将不胜感激。
示例场景
发布模式用户开始在我们的应用程序中录音,将他们导航到“正在录音”屏幕
用户 returns 进入 iPhone 主屏幕并锁定他们的 phone。
五分钟后,用户点亮屏幕确认状态栏中橙色活动录音指示器仍然可见。
又过了五分钟。用户打开屏幕看到橙色活动录制指示器不再可见(但这大约只发生 10 次中的 1 次)
用户将他们的 phone 和 returns 解锁到我们的应用程序。他们现在回到了主屏幕,而不是活动的录制屏幕。
之前的调查:
- Bugsnag 在此会话期间没有针对该用户的未捕获错误(也没有有用的线索)。这包括没有 OOM 错误的报告。
- Crashlytics 和 Xcode Organizer 崩溃日志均未显示神秘终止期间 window 期间的任何崩溃。
- None 用户当天的 Jetsam 事件日志中提到了我们的应用程序。
有关录音在我们的应用程序中如何工作的信息
- 我们录制音频并将其以约 100 万个块的形式上传到我们的服务器。
- 尝试上传之前将音频块保存到设备,并在上传成功后删除。
- 我们使用 ffmpeg 提取 1m 的音频块而不停止我们的录音会话以避免在后台暂停。
额外的用户上下文
- 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) 后台内存不足终止。
Apple 在应用程序终止时给出的提示很少。使用 Embrace.io(很棒的公司!),我能够从后台(BOOM)开始测量 out-of-memory 终止的发生。
使用 React Native 工具进行分析,我能够识别出即使在后台,应用程序 re-renders 和响应 Firestore 侦听器的 redux 操作也会导致大量 CPU 使用。在进入后台时终止不必要的侦听器并卸载大多数屏幕使我们能够显着减少后台 CPU 使用,提高电池效率并几乎消除 BOOMs
如果有人有具体问题,我们很乐意详细说明。在这个问题上花了很多时间。
你好
我的 React Native 应用程序出现问题,当应用程序处于后台时,录音有时会莫名其妙地终止。
这种情况只发生在大约 1/10 的用户会话中,在录制开始后 5 到 50 分钟不等的不同时间段之后。
更多上下文如下。
几周来我一直在努力解决这个问题,但没有任何进展。对于可能导致此问题的原因或我应该在何处进一步调查的任何想法,我们将不胜感激。
示例场景
发布模式用户开始在我们的应用程序中录音,将他们导航到“正在录音”屏幕
用户 returns 进入 iPhone 主屏幕并锁定他们的 phone。
五分钟后,用户点亮屏幕确认状态栏中橙色活动录音指示器仍然可见。
又过了五分钟。用户打开屏幕看到橙色活动录制指示器不再可见(但这大约只发生 10 次中的 1 次)
用户将他们的 phone 和 returns 解锁到我们的应用程序。他们现在回到了主屏幕,而不是活动的录制屏幕。
之前的调查:
- Bugsnag 在此会话期间没有针对该用户的未捕获错误(也没有有用的线索)。这包括没有 OOM 错误的报告。
- Crashlytics 和 Xcode Organizer 崩溃日志均未显示神秘终止期间 window 期间的任何崩溃。
- None 用户当天的 Jetsam 事件日志中提到了我们的应用程序。
有关录音在我们的应用程序中如何工作的信息
- 我们录制音频并将其以约 100 万个块的形式上传到我们的服务器。
- 尝试上传之前将音频块保存到设备,并在上传成功后删除。
- 我们使用 ffmpeg 提取 1m 的音频块而不停止我们的录音会话以避免在后台暂停。
额外的用户上下文
- 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) 后台内存不足终止。
Apple 在应用程序终止时给出的提示很少。使用 Embrace.io(很棒的公司!),我能够从后台(BOOM)开始测量 out-of-memory 终止的发生。
使用 React Native 工具进行分析,我能够识别出即使在后台,应用程序 re-renders 和响应 Firestore 侦听器的 redux 操作也会导致大量 CPU 使用。在进入后台时终止不必要的侦听器并卸载大多数屏幕使我们能够显着减少后台 CPU 使用,提高电池效率并几乎消除 BOOMs
如果有人有具体问题,我们很乐意详细说明。在这个问题上花了很多时间。