app端必须用uni.getbackgroundaudiomanager(),它是ios/android注册系统音频会话的唯一通道;需配置manifest.json中uibackgroundmodes:["audio"](ios)和wake_lock权限(android),设置title/singer/coverimgurl后调用play(),并重新云打包生效。

App端必须用 uni.getBackgroundAudioManager(),不是可选而是强制路径
微信小程序能用 uni.getBackgroundAudioManager() 实现锁屏控制,App 端同样必须走这条路——它才是 iOS/Android 原生层注册音频会话的唯一通道。别被“App 也支持 uni.createInnerAudioContext()”误导,后者在锁屏后大概率被系统静音或销毁,尤其 iOS 上几乎必然中断。
常见错误现象:调用 play() 后前台正常,一锁屏就无声;或锁屏界面完全不显示歌曲信息。根本原因就是用了页面级音频上下文,没走系统音频会话入口。
- iOS 必须搭配
UIBackgroundModes: ["audio"]才有后台播放资格,否则连会话都注册不上 - Android 虽不强制报错,但没加
WAKE_LOCK权限,华为、小米等机型锁屏几秒后自动暂停 -
uni.getBackgroundAudioManager()在 H5 端完全无效,调用无报错但也不起作用,务必用条件编译隔离
manifest.json 配置必须精确到字段层级和转义格式
很多项目卡在这一步:写了配置却不起作用,以为是代码问题,其实是 JSON 写错了位置或格式不对。这个配置不是勾选项,必须手动编辑源码视图,且 iOS 和 Android 不能混写、不能漏项。
- iOS 配置要嵌套在
app-plus → distribute → ios下,完整写成:"ios": {"UIBackgroundModes": ["audio"]},注意是数组,"audio"不能拼错、不能带空格 - Android 权限必须写在
app-plus → distribute → android → permissions下,正确写法是:"permissions": ["<uses-permission android:name='\"android.permission.WAKE_LOCK\"'></uses-permission>"],XML 标签必须转义且闭合 - 改完
manifest.json后必须重新云打包,热更新和本地调试不会生效;真机测试前确认打包日志里有类似background audio enabled的提示
锁屏界面信息不显示?title、singer、coverImgUrl 缺一不可
iOS 锁屏界面只认这三个字段,缺任意一个,系统就当“无媒体信息”处理,直接不显示控制条。Android 虽依赖原生 MediaSession,但这三项仍是基础门槛。
-
coverImgUrl必须是本地绝对路径(如/static/cover.jpg),网络地址在 App 端无效 -
title和singer至少填两个,否则 iOS 锁屏只显示“未知” - 封面图尺寸建议 ≥ 300×300,否则 Android 微信通知栏缩略图模糊或不显示(注意:这是微信小程序要求,App 端虽无此限制,但统一按高标准设更稳妥)
- 设置元数据后必须显式调用
manager.play(),仅赋值src不会触发加载或播放
监听状态变化只能靠 manager 自身事件,别信 onHide/onShow
页面生命周期钩子(如 onHide、onShow)和音频实际状态不同步。用户从锁屏界面点播放键,onShow 可能还没触发,但音频已经播了——真正反映操作的是 manager 自身事件。
-
onPlay、onPause、onStop等必须在获取实例后立即绑定,且只能绑定一次,重复绑定会导致多次触发 -
onTimeUpdate频率约 250ms 一次,不适合做高精度拖动,仅适合更新进度条或歌词同步 - 不要在
onHide里手动pause(),用户可能正通过锁屏控件操作;应以 manager 状态为准,监听onPause后再做 UI 同步
onLaunch 里提前取了实例,play() 也得等用户点击按钮才执行;否则部分 iOS 版本会静音且无任何报错。











