真后台音频必须分平台实现:微信小程序用uni.getBackgroundAudioManager()并预设元信息;App端需配置manifest权限并云打包;H5端无真正后台,须用户手势触发播放。
不能靠 uni.createinneraudiocontext() 在微信小程序里实现真后台播放,它在切后台或锁屏时必然暂停;也不能指望 <audio></audio> 标签跨端可用——h5 可能播,小程序和 app 端基本失效。真后台音频(锁屏/切应用仍持续播放)必须按平台分路径处理。
微信小程序必须用 uni.getBackgroundAudioManager()
这是唯一支持系统级后台音频会话的 API,但要注意它不是 uni. 封装的通用接口,只在微信小程序环境存在:
- 必须在
App.vue的onLaunch或页面onReady阶段获取并缓存,例如:uni.$bgm = uni.getBackgroundAudioManager(),避免每次页面加载都重复取实例 - 播放前必须设置
title、singer、epname(至少前三项),否则 iOS 锁屏控制中心不显示,甚至触发失败且无报错 -
src必须是 HTTPS 直链地址,不能是/static/xxx.mp3这类本地路径;Android 部分机型也拒绝 HTTP - 事件监听(如
onPlay、onTimeUpdate)只能绑定一次,重复绑定会导致多次触发;onTimeUpdate频率约 250ms 一次,不适合做高精度拖动
App 端必须配 manifest + 用 uni.getBackgroundAudioManager()
别被“App 支持 uni.createInnerAudioContext()”误导——它在锁屏后大概率被系统静音或杀进程,只有 uni.getBackgroundAudioManager() 能注册系统音频会话:
- manifest.json 中必须精确配置:
app-plus → distribute → ios → UIBackgroundModes: ["audio"],且是数组,拼写不能错 - Android 需加权限:
"permissions": ["<uses-permission android:name='\"android.permission.WAKE_LOCK\"'></uses-permission>"],XML 标签要转义、闭合 - 改完 manifest 后必须重新云打包,本地调试或热更新不会生效
- 封面图(
coverImgUrl)必须是本地绝对路径(如/static/cover.jpg),网络地址无效;且要在play()成功后调用,否则 iOS 不同步显示
H5 端没有“后台”,自动播放必须用户手势触发
H5 本质无后台概念,切页、切 Tab、浏览器休眠都会中断播放。所谓“背景音乐”只是当前页面可见时持续播,且必须由用户点击等交互启动:
- 不能在
onLoad或onShow里直接调play(),否则 iOS Safari 和部分安卓 WebView 会抛DOMException: play() failed - 推荐做法:创建
uni.createInnerAudioContext()并预设src,等用户点击按钮或任意区域后再调.play() - iOS 上可先设
volume = 0静音播放,等用户首次点击再恢复音量,规避“无声但已播”的体验断层 - 别依赖
loop = true实现无缝循环——iOS 有 100–300ms 间隙,应监听onEnded后手动seek(0)+play(),并加try/catch防止 Androidseek失败
别踩这些坑:跨平台混用、权限漏配、时机错乱
最常卡住的地方不是代码写错,而是平台约束没对齐:
- 在非微信平台(如 H5 或 App)调用
uni.getBackgroundAudioManager()会返回undefined,不报错但也不工作,必须用条件编译隔离 - App 端没勾选 manifest 里的 “Background Mode” 模块,或 iOS 漏掉
UIBackgroundModes,打包日志里看不到 “background audio enabled”,就等于没开权限 - 页面
onHide时误调pause(),尤其华为/小米机型可能直接中断音频;保持播放状态即可,无需干预 -
uni.createAudioContext()已废弃多年,H5 外所有平台都返回空对象,继续用等于放弃真机测试
后台音频不是“写个 play 就行”的功能,它横跨平台能力、系统权限、用户交互时机三重边界。漏掉任一环,表现都是“播着播着就没了”,而且往往没错误提示——得靠逐项核对平台文档和 manifest 打包日志才能定位。


















