锁屏控制必须使用 uni.getbackgroundaudiomanager() 并配置平台权限,uni.createinneraudiocontext() 因无系统音频会话无法后台保活;ios 需 manifest 中 ios.uibackgroundmodes: ["audio"],android 需 wake_lock 权限;锁屏控件显示依赖 title、singer、coverimgurl 三字段且 coverimgurl 必须 https。

锁屏控制功能不是“装个插件就能开”,而是必须走 uni.getBackgroundAudioManager() 这条原生通路,再配对平台级配置。其他任何音频插件(比如基于 uni.createInnerAudioContext() 封装的)在锁屏/后台场景下大概率失效,尤其 iOS 会直接静音。
为什么不能用 uni.createInnerAudioContext() 实现锁屏控制
这个 API 本质是前台音频上下文,系统不认为它需要后台保活权限。切后台后:iOS 几乎必然中断、Android 多数机型几秒内暂停,且锁屏界面完全不显示控件。微信小程序里它连 showCenterControl: true 都被忽略——不是 bug,是平台限制。
-
uni.createInnerAudioContext()没有系统级音频会话,无法触发 iOS 的AVAudioSessionCategoryPlayback - 它不支持设置
coverImgUrl、singer等锁屏元数据字段 - 即使手动绑定
onHide触发播放,也仅能“骗过”部分 Android 厂商策略,无法稳定保活
manifest.json 权限配置必须精确嵌套
很多项目卡在这一步:写了配置但不起作用,以为代码有问题,其实是 JSON 结构错了。iOS 和 Android 配置不能混写,也不能漏项。
- iOS 配置必须放在
app-plus → distribute → ios下,格式为:"ios": {"UIBackgroundModes": ["audio"]}—— 注意是数组,"audio"不能拼错或带空格 - Android 配置放在
app-plus → distribute → android → permissions下,值为字符串数组:["<uses-permission android:name='\"android.permission.WAKE_LOCK\"'></uses-permission>"]—— XML 标签要转义,斜杠不能省 - 改完必须重新云打包,热更新和本地调试无效;打包日志里应出现
background audio enabled提示
锁屏界面不显示控件?检查这三个字段
iOS 锁屏界面只认 title、singer、coverImgUrl,缺一不可。Android 虽依赖原生 MediaSession,但这三个是基础门槛。
-
title必填,否则 iOS 直接不渲染锁屏控件 -
coverImgUrl必须是 HTTPS 可直链地址(App 端不支持file://协议) -
singer推荐填,部分 Android 厂商(如华为 EMUI)会因缺失该字段隐藏封面 - 首次播放必须由用户手势触发(例如 button click),否则 iOS 会拒绝激活音频会话
真机测试前最容易忽略的点
你写的代码可能全对,但真机上就是没反应——大概率是因为没处理好平台差异和初始化时机。
- 微信小程序平台下,
uni.getBackgroundAudioManager()是全局单例,必须在App.vue的onLaunch中初始化并挂到uni.$bgm,避免页面反复重绑事件导致状态混乱 - iOS 上若用网络音频,必须是 HTTPS;Android 部分版本也强制要求,HTTP 地址会被拦截
- 本地音频路径(如
/static/silent.mp3)在 App 端可用,但 H5 端该 API 完全无效,需用new Audio()+document.visibilityState降级
锁屏控制不是靠“插件开关”打开的,而是靠正确调用原生音频会话 + 精确配置 + 字段完整性共同生效。任何一个环节出错,都会表现为无声、无控件、或闪退——问题往往不在 JS 层,而在 manifest 或原生权限层。











