ios - 为什么我的 native react 应用程序在录制时在后台终止(iOS,RN 0.63.3,Expo-Av 9.2.3)

标签 ios react-native background-process avaudiorecorder expo-av

你好

我的 React Native 应用程序出现问题,当应用程序处于后台时,录音有时会莫名其妙地终止。

这种情况只发生在大约 1/10 的用户 session 中,在录制开始后 5 到 50 分钟的可变时间之后。

其他上下文如下。

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

示例场景

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

  2. 用户返回 iPhone 主屏幕并锁定手机。

  3. 五分钟后,用户打开屏幕以确认橙色事件录音指示器在状态栏中仍然可见。

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

  5. 用户解锁手机并返回到我们的应用。他们现在回到了主屏幕,而不是事件的录制屏幕。

事先调查:

  • Bugsnag 在此 session 期间没有针对该用户的未捕获错误(也没有有用的线索)。这包括不报告 OOM 错误。
  • Crashlytics 和 Xcode Organizer 崩溃日志均未显示在神秘终止的时间窗口内发生任何崩溃。
  • 用户当天的 Jetsam 事件日志均未提及我们的应用。

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

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

额外的用户上下文

  • 问题出现在 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)。

通过使用 React Native 工具进行分析,我能够确定即使在后台,响应 Firestore 监听器的应用程序重新呈现和 redux 操作也会导致大量 CPU 使用。在进入后台时终止不必要的监听器并卸载大多数屏幕,这使我们能够显着降低后台 CPU 使用率,提高电池效率并几乎消除 BOOM

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

关于ios - 为什么我的 native react 应用程序在录制时在后台终止(iOS,RN 0.63.3,Expo-Av 9.2.3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71656047/

相关文章:

objective-c - 如何在 Xcode 中为进度条创建平滑的动画

ios - Spinner(UIActivityIndi​​cator) 在 iOS 中不显示

javascript - React Native图像上传文件扩展名错误

haskell - 单独的 'App' 和 'BackgroundJobs' 包的布局

ios - 使用 phonegap ios 应用程序在后台启用下载

iphone - iPhone 的加速度计有多精确——是否可以绘制出相对准确的手机位置运动路径?

ios - 未调用 deinit 的解释

javascript - JavaScript/React 中的bind()

javascript - 在使用后重新分配变量?

background-process - 是否可以使用 node-webkit 创建后台应用程序?