微信小程序后台音频锁屏失效本质是未满足系统认证条件:title/singer/epname至少填两个、coverImgUrl需HTTPS且≥300×300、src设后须显式调play()、首次播放需用户手势触发;Android需manifest配置audio模式,iOS需UIBackgroundModes设为["audio"];其他平台不支持该API。

微信小程序平台下,uni.getBackgroundAudioManager() 在锁屏后被系统拦截,本质是字段缺失、协议不合规或时机错误导致的“假播放”——它压根没真正进入后台音频通道,不是系统拦截,而是你没让它被系统认可。
为什么锁屏后音频秒停、控制条消失
iOS 微信锁屏界面只显示控制条,前提是它认出这是个“合法后台音频源”。否则直接当普通页面音频处理,锁屏瞬间静音。常见硬性失败点:
-
title、singer、epname三者至少填两个,只填title会导致锁屏显示“未知”,iOS 直接降级为前台音频行为 -
coverImgUrl必须是 HTTPS 地址,且尺寸 ≥ 300×300;Android 微信通知栏缩略图模糊或不显示,往往是因为尺寸太小或协议不对 -
src设了但没调manager.play()—— 这个动作必须显式触发,否则 manager 处于“待命”状态,锁屏即失效 - 首次播放未由用户手势触发(如
@click),iOS 会静默拒绝,不报错也不回调
Android 锁屏后无通知栏/进度条
不是 API 调用问题,是原生层没声明音频后台能力。仅靠 JS 调用 uni.getBackgroundAudioManager() 不够,必须补 manifest 配置:
- Android:在
manifest.json的app-plus.background.mode中设为"audio"(不是"location"或空字符串) - iOS:同文件中
app-plus.distribute.ios.UIBackgroundModes必须是["audio"](注意是数组,不是字符串) - 漏掉任一配置,Android 可能播着播着断掉,iOS 则完全不进后台音频通道,连
onPlay都可能不触发
切后台时 onPlay 不触发、状态不同步
别依赖 onShow/onHide 去同步播放状态——这些生命周期在锁屏场景下不可靠。正确做法是把状态绑定到 manager 自身事件:
- 监听
manager.onPlay、manager.onPause、manager.onStop,而不是监听页面钩子 - 不要在
onHide里手动pause(),这反而会中断系统接管;真要暂停,应由用户操作触发 - 锁屏后用户通过耳机键或通知栏控件操作,只会触发 manager 的事件,不会走页面生命周期
- 若需 UI 同步(如播放按钮变暂停),必须在
manager.onPlay和manager.onPause里显式更新 data
支付宝/字节等平台锁屏必停,别硬套微信方案
uni.getBackgroundAudioManager() 在非微信平台返回空对象或直接报错,这不是兼容性问题,是平台根本不提供该能力。试图加 ifdef APP-PLUS 或判断平台再调用,只会让代码更混乱:
- 支付宝、字节、快应用:只能用
uni.createInnerAudioContext(),切后台即停,无法恢复;降级策略只有两种:前台恢复时提示“继续播放”,或锁屏后隐藏控制条 - H5 端无“后台”概念,用
new Audio()+document.hidden监听即可,别引入 BackgroundAudioManager - App 端 iOS 若用了
uni.getBackgroundAudioManager()却没配UIBackgroundModes,表现和小程序一样:锁屏秒停,且无任何错误提示
最容易被忽略的是「平台能力边界」:微信有 BackgroundAudioManager 是特例,不是标准;其他平台没这个接口,就真的没有——不是你配置少了,是它从不存在。


















