iOS应用后台运行时react-native-sound无法播放音频问题求助
问题原因
iOS后台仅日志正常输出说明react-native-background-timer的后台保活逻辑已经生效,音频无法播放是因为iOS系统对后台音频有独立的权限和音频会话配置要求,现有配置未满足系统规则。
解决步骤
1. 开启iOS项目后台音频能力
用Xcode打开iOS工程,进入Signing & Capabilities标签页,点击左上角+号添加Background Modes能力,勾选列表中的Audio, AirPlay, and Picture in Picture选项,保存后重新编译项目。
配置完成后可检查
ios/[项目名]/Info.plist文件,确认已自动生成如下配置:<key>UIBackgroundModes</key> <array> <string>audio</string> </array>
2. 修正音频会话配置
原Sound.setCategory配置缺少适配后台的参数,修改初始化阶段的音频配置:
import BackgroundTimer from 'react-native-background-timer' import Sound from 'react-native-sound' // 第二个参数为true表示允许与其他应用音频混合,第三个参数为false表示不压低其他音频,可根据业务需求调整 Sound.setCategory('Playback', true, false) // 主动激活音频会话,避免后台时被系统回收 Sound.setActive(true) const soundEnd = new Sound('end.mp3', Sound.MAIN_BUNDLE)
3. 优化后台播放逻辑
后台触发播放时优先重新激活音频会话,同时增加音频加载状态校验,避免实例异常导致播放失败:
const Timer = () => { useEffect( () => { const timeoutId = BackgroundTimer.setTimeout(() => { console.log('END setTimeout') // 播放前重新激活音频会话 Sound.setActive(true) if (soundEnd.isLoaded()) { soundEnd.play((success) => { // 播放失败时重新加载重试 if (!success) { soundEnd.reload() soundEnd.play(() => {}) } }) } else { soundEnd.load(() => { soundEnd.play(() => {}) }) } }, 10000) return () => { BackgroundTimer.clearTimeout(timeoutId) } }, [] ) }
完成以上三步后重新运行项目即可正常在iOS后台播放音频。
内容的提问来源于stack exchange,提问作者Gaylord.P
相关产品推荐
相关产品推荐

