微信小程序必须用 uni.getbackgroundaudiomanager() 实现后台播放,其他平台切后台必停且无绕过方案;ios 微信需 ≥8.0.22 真机测试才生效。

只能用 uni.getBackgroundAudioManager(),且仅微信小程序有效;其他平台(支付宝、字节、H5、App)切后台必停,没有绕过方案。
为什么 uni.createInnerAudioContext() 切后台就停
它绑定页面生命周期,退到后台或切换 Tab 时,系统强制暂停音频上下文,且无法恢复。这不是 uni-app 的 bug,是微信/支付宝等平台的原生限制——所有普通 AudioContext 都会被挂起。iOS 尤其严格,连 onTimeUpdate 都会停止触发。
- 常见错误:以为加了
"requiredBackgroundModes": ["audio"]就能生效 → 这个配置只对 App 和 H5 有效,小程序里完全 ignored - 误把
uni-audio组件当后台播放器用 → 它底层仍是createInnerAudioContext(),iOS 下锁屏即停 - 调用
play()前没设title/singer/epname→ iOS 微信锁屏界面不显示控制条,用户无法操作
微信小程序必须用 uni.getBackgroundAudioManager()
这是微信唯一开放的后台音频通道,独立于页面,支持锁屏控制、进度同步、前后台自动续播。
- 必须由用户手势触发(如点击按钮),不能 onload 自动播,否则静默失败
-
manager.src必须赋值后,再调用manager.play();只设 src 不等于 ready - 务必填全元数据:
manager.title、manager.singer、manager.epname、manager.coverImgUrl(可填占位图) - 监听
manager.onPlay/manager.onPause/manager.onEnded,不要依赖页面onShow/onHide
const manager = uni.getBackgroundAudioManager(); manager.title = '我的歌'; manager.singer = '歌手'; manager.epname = '专辑'; manager.coverImgUrl = 'https://example.com/cover.jpg'; manager.src = 'https://example.com/song.mp3'; manager.play();
支付宝/字节/快应用/H5 怎么办
这些平台目前没有等效的 BackgroundAudioManager 接口。调用 uni.createInnerAudioContext() 后切后台,音频必然中断,且无法通过任何 manifest 配置、权限开关或 JS 逻辑恢复。
- H5 端:浏览器无“后台”概念,切标签页即 stop,
visibilitychange监听只能做暂停/恢复,不能维持播放 - App 端:需在
manifest.json的app-plus节点下配"requiredBackgroundModes": ["audio"],并确保原生层启用 Audio 模块,否则进程被杀 - 降级建议:检测平台,微信走
getBackgroundAudioManager,其他平台只做前台播放 + 页面离开时pause(),避免用户切回来听到跳播
全局单例管理音频状态容易踩的坑
多个页面共用一个音频实例时,stop() 并非真正停止,而是重置并从头播放,会导致重叠声或误触发。
- 别用
stop()做暂停逻辑,改用pause(),并在onPause/onEnded中统一维护isPlaying状态 - 连点问题:播放中快速点击暂停/播放,
previousSrc判断可能失效,建议加防抖或直接用manager.paused状态判断 - 页面销毁时记得调
manager.pause(),否则后台还在播,用户可能误以为没关
最易忽略的一点:微信后台音频能力只在真机生效,开发者工具里无论怎么配都模拟不出后台播放效果;测试必须上真机,且 iOS 微信版本需 ≥ 8.0.22,部分旧版本即使代码正确也会静音。











