为什么我的本机反应应用程序在录制时在后台终止(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 分钟不等的不同时间段之后。

更多上下文如下。

几周来我一直在努力解决这个问题,但没有任何进展。对于可能导致此问题的原因或我应该在何处进一步调查的任何想法,我们将不胜感激。

示例场景

  1. 发布模式用户开始在我们的应用程序中录音,将他们导航到“正在录音”屏幕

  2. 用户 returns 进入 iPhone 主屏幕并锁定他们的 phone。

  3. 五分钟后,用户点亮屏幕确认状态栏中橙色活动录音指示器仍然可见。

  4. 又过了五分钟。用户打开屏幕看到橙色活动录制指示器不再可见(但这大约只发生 10 次中的 1 次)

  5. 用户将他们的 phone 和 returns 解锁到我们的应用程序。他们现在回到了主屏幕,而不是活动的录制屏幕。

之前的调查:

有关录音在我们的应用程序中如何工作的信息

额外的用户上下文

环境

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

如果有人有具体问题,我们很乐意详细说明。在这个问题上花了很多时间。