微信小程序必须用uni.getBackgroundAudioManager(),因支付宝等平台无后台音频能力;其他平台需降级处理,iOS微信或App端可用uni.createInnerAudioContext()并启用Audio模块。

微信小程序必须用 uni.getBackgroundAudioManager(),其他平台不支持
这不是 uni-app 的 Bug,而是平台限制:支付宝、字节、快应用等小程序平台压根没提供后台音频能力,uni.createInnerAudioContext() 切后台必然中断,加任何配置都无效。只有微信小程序开放了 BackgroundAudioManager 这个独立于页面生命周期的接口,且必须通过 uni.getBackgroundAudioManager() 获取。
常见错误现象:
- 调用
uni.createInnerAudioContext()后切后台,onTimeUpdate立即停止触发 - 误以为在
manifest.json里加"requiredBackgroundModes": ["audio"]就能跨平台生效 —— 这仅对微信小程序起作用,且只在真机有效(开发者工具常有延迟或假象)
实操建议:
- 只在微信平台(
process.env.UNI_PLATFORM === 'mp-weixin')中使用uni.getBackgroundAudioManager() - 其他平台需降级处理:切后台时暂停播放,切前台再恢复(靠
onShow/onHide监听) - 必须设置
manager.title、manager.epname、manager.singer,否则 iOS 微信锁屏界面不显示控制条,用户无法操作
uni.createInnerAudioContext() 在 iOS 微信和 App 端才能绕过静音限制
如果你的目标是 iOS 微信或 uni-app 打包的 App(非小程序),uni.createInnerAudioContext() 反而是更可靠的选择,因为它能响应用户手势后维持后台播放;而 uni.getBackgroundAudioManager() 在 App 端根本不工作。
关键前提是:
- iOS App 必须在
manifest.json中启用 Audio 模块,并声明UIBackgroundModes: ["audio"] - Android App 需添加
<uses-permission android:name="android.permission.WAKE_LOCK" /> - 播放必须由用户点击等交互触发,不能在
onLoad或created中直接play() - 音频资源必须是 HTTPS URL,本地路径(如
/static/xxx.mp3)在 iPhone X+ 上大概率失败
示例片段:
const audio = uni.createInnerAudioContext();
audio.src = 'https://example.com/song.mp3';
// 必须在 click/tap 回调里调用
button.addEventListener('click', () => {
audio.play();
});
循环播放有 Gap?别只设 loop = true
iOS 和部分 Android 机型不支持真正无缝循环,audio.loop = true 会导致 100–300ms 卡顿,用户能明显感知断点。
正确做法是监听 onEnded 并手动重置:
- 先调用
audio.seek(0),再audio.play() - 但
seek(0)在某些 Android 机型上会失败,需加try/catch - fallback 方案:捕获异常后重新赋值
src再play()
注意:不要在 onEnded 里重复创建新 InnerAudioContext 实例,容易内存泄漏;复用当前实例即可。
切后台后无法控制?得在进入后台前“预占位”
微信小程序有个隐藏规则:只有在切后台前已处于播放状态,后续才能通过 manager.play()/manager.pause() 控制。如果切后台时音频是暂停的,再切回来也无法恢复控制。
实操建议:
- 在
onHide生命周期里主动调用manager.play()(哪怕只是播 100ms 的静音片段),让系统认为“正在播放” - 避免在
onHide中直接manager.stop(),这会让 manager 进入不可控状态 - 真机调试必须做,开发者工具对后台行为模拟不准,尤其 iOS 锁屏控制条是否出现,只看真机
最容易被忽略的是:iOS 微信锁屏界面是否显示控制条,不仅取决于 title 是否设置,还取决于音频是否真正在播放中 —— 没有实际播放,光设字段也没用。


















