You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Expo/裸React Native iOS应用能否实现后台长时间录音?求技术方案

针对iOS平台的React Native/Expo语音备忘录实现方案

Expo 方案

核心依赖

使用 expo-av 库——Expo官方提供的多媒体处理工具,原生支持iOS后台录音场景。

配置步骤

  1. 权限与后台模式配置
    在 app.json 中添加必要配置,确保iOS系统允许后台录音和麦克风访问:
{
  "expo": {
    "ios": {
      "infoPlist": {
        "NSMicrophoneUsageDescription": "需要访问麦克风进行语音录制",
        "UIBackgroundModes": ["audio"]
      }
    }
  }
}

其中 UIBackgroundModes 设为 audio 是iOS允许后台持续录音的核心配置项。

  1. 录音实现关键代码
  • 初始化音频会话,开启后台录音支持:
import { Audio } from 'expo-av';

async function setupAudioSession() {
  await Audio.setAudioModeAsync({
    allowsRecordingInBackground: true,
    playsInSilentModeIOS: true,
    audioMode: Audio.AudioMode.PlayAndRecord,
  });
}
  • 启动录音,通过参数控制文件大小以支持1小时录制:
let recording = new Audio.Recording();

async function startRecording() {
  await setupAudioSession();
  await recording.prepareToRecordAsync({
    ios: {
      format: Audio.RECORDING_FORMAT_IOS.MPEG4AAC,
      sampleRate: 44100,
      numberOfChannels: 1,
      bitRate: 128000, // 128kbps码率下,1小时录音约60MB,存储压力可控
    },
  });
  await recording.startAsync();
}
  • 停止录制并获取文件路径:
async function stopRecording() {
  await recording.stopAndUnloadAsync();
  const recordingUri = recording.getURI();
  // 后续可将文件保存至指定目录或进行上传
}

注意事项

  • Expo的 expo-av 已封装iOS后台录音的底层逻辑,配置正确的前提下,应用进入后台后录音会持续进行。
  • 可通过调整 bitRate 平衡录音质量与文件大小,确保1小时录制的文件不会占用过多设备存储。

裸React Native方案

核心依赖

  • react-native-audio-recorder-player:成熟的跨平台录音库,原生支持iOS后台操作
  • react-native-permissions:用于请求麦克风权限

配置步骤

  1. iOS原生配置
    在项目的 Info.plist 中添加权限与后台模式声明:
<key>NSMicrophoneUsageDescription</key>
<string>需要访问麦克风进行语音录制</string>
<key>UIBackgroundModes</key>
<array>
  <string>audio</string>
</array>
  1. 权限请求
import { check, request, PERMISSIONS } from 'react-native-permissions';

async function requestMicrophonePermission() {
  const status = await check(PERMISSIONS.IOS.MICROPHONE);
  if (status !== 'granted') {
    await request(PERMISSIONS.IOS.MICROPHONE);
  }
}
  1. 录音实现
import AudioRecorderPlayer from 'react-native-audio-recorder-player';
import RNFS from 'react-native-fs';

const audioRecorderPlayer = new AudioRecorderPlayer();

async function startRecording() {
  await requestMicrophonePermission();
  // 将录音文件存储在Documents目录,避免被系统自动清理
  const savePath = `${RNFS.DocumentDirectoryPath}/voice_recording.m4a`;
  await audioRecorderPlayer.startRecorder(savePath, {
    ios: {
      audioQuality: 'high',
      format: 'aac',
      sampleRate: 44100,
      numberOfChannels: 1,
      bitRate: 128000,
    },
  });
}

async function stopRecording() {
  const recordResult = await audioRecorderPlayer.stopRecorder();
  // recordResult包含录音时长等信息,文件已保存至指定路径
}

注意事项

  • 确保依赖已通过自动链接或手动配置完成原生项目集成。
  • 后台录音依赖iOS音频会话的持续激活,react-native-audio-recorder-player 会自动处理该逻辑,但必须配置 UIBackgroundModes。

通用注意点

  • iOS后台资源限制:若应用在后台长时间无活跃音频会话,系统可能暂停录音,需确保音频会话始终处于激活状态。
  • 录音文件建议存储在 Documents 目录,避免被iOS的自动清理机制删除。

内容的提问来源于stack exchange,提问作者Aleksandar Petkovic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 19:45:09