微信小程序支持后台音频播放,需用uni.getBackgroundAudioManager();其他平台如支付宝、字节等不支持后台音频,切后台必停,无法通过配置解决。
这不是 uni-app 的 bug,而是微信/支付宝等小程序平台的强制限制:所有音频上下文(AudioContext)在页面进入后台或小程序被挂起时,会被系统自动暂停且无法恢复。uni-app 的 uni.createInnerAudioContext() 本质就是封装了平台原生的音频 API,逃不开这个限制。
所以“配置后台运行”不是靠改 manifest.json 或加某个开关就能解决的——平台根本不允许普通音频在后台持续播放。
BackgroundAudioManager
只有微信小程序提供了绕过限制的专用接口:BackgroundAudioManager。它独立于页面生命周期,支持后台播放、锁屏控制、进度同步。uni-app 不直接暴露该对象,但可通过 uni.getBackgroundAudioManager() 获取。
常见错误现象:
uni.createInnerAudioContext() 后切后台,音频立即中断,onTimeUpdate 停止触发"requiredBackgroundModes": ["audio"](iOS plist 配置)就能生效 —— 这在小程序里完全无效实操建议:
uni.getBackgroundAudioManager(),其他平台(如支付宝、字节)不支持该能力,需降级处理title、epname、singer 等字段,否则 iOS 微信锁屏界面不显示控制条manager.src = 'xxx.mp3',再调用 manager.play();不能只设 src 就认为已就绪manager.onPlay、manager.onPause、manager.onEnded,而不是依赖页面 onShow/onHide示例片段:
const manager = uni.getBackgroundAudioManager();manager.title = '我的歌';manager.epname = '专辑名';manager.singer = '歌手';manager.src = 'https://example.com/song.mp3';manager.play();
这些平台目前未提供类似微信 BackgroundAudioManager 的稳定接口。调用 uni.createInnerAudioContext() 后切后台,音频必然中断,且无法通过任何配置恢复。
使用场景判断:
setInterval + manager.seek() 模拟续播 —— 切后台后 JS 定时器基本失效,且平台会主动终止音频资源兼容性影响:
manager.status 并降级提示必须用条件编译区分平台,不能靠运行时 uni.getSystemInfoSync().platform 判断——因为 BackgroundAudioManager 在非微信环境调用会直接报错(如支付宝返回 undefined,字节抛异常)。
实操建议:
#ifdef MP-WEIXIN 包裹所有 uni.getBackgroundAudioManager() 相关逻辑,其他平台走 InnerAudioContext 或静音兜底onLoad 里直接初始化 manager,应在用户明确触发播放操作(如点击按钮)后再创建,避免无意义资源占用manager.onStateChange(state=2 表示暂停),但该回调不一定及时 —— 不要依赖它做关键状态同步src 赋值后播放失败无提示关键点就在这里:后台音频不是配置问题,是平台能力边界问题。微信有,其他基本没有。硬要跨平台统一行为,只会陷入反复调试却始终无法满足预期的循环。