Expo/裸React Native iOS应用能否实现后台长时间录音?求技术方案
针对iOS平台的React Native/Expo语音备忘录实现方案
Expo 方案
核心依赖
使用 expo-av 库——Expo官方提供的多媒体处理工具,原生支持iOS后台录音场景。
配置步骤
- 权限与后台模式配置
在app.json中添加必要配置,确保iOS系统允许后台录音和麦克风访问:
{ "expo": { "ios": { "infoPlist": { "NSMicrophoneUsageDescription": "需要访问麦克风进行语音录制", "UIBackgroundModes": ["audio"] } } } }
其中 UIBackgroundModes 设为 audio 是iOS允许后台持续录音的核心配置项。
- 录音实现关键代码
- 初始化音频会话,开启后台录音支持:
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:用于请求麦克风权限
配置步骤
- iOS原生配置
在项目的Info.plist中添加权限与后台模式声明:
<key>NSMicrophoneUsageDescription</key> <string>需要访问麦克风进行语音录制</string> <key>UIBackgroundModes</key> <array> <string>audio</string> </array>
- 权限请求
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); } }
- 录音实现
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
相关产品推荐
相关产品推荐

