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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:39:03