必须用uni.getbackgroundaudiomanager()实现锁屏控件切换频道,因uni.createinneraudiocontext()无系统音频会话,锁屏后即静音;需配置uibackgroundmodes:["audio"]、绑定onprev/onnext事件、更新src/title/singer/coverimgurl并重新play()。

锁屏控制切换频道必须用 uni.getBackgroundAudioManager()
想在锁屏界面点上一首歌、切下一个电台,uni.createInnerAudioContext() 完全不行——它没注册系统音频会话,锁屏后几秒就被静音,iOS 上基本秒断。只有 uni.getBackgroundAudioManager() 能让系统知道“这 app 正在播音频”,从而把播放控件(包括上一曲/下一曲按钮)投射到锁屏界面。
注意:这不是“增强体验”的可选项,而是 iOS 和 Android 后台音频的强制入口。漏掉它,后续所有逻辑都白搭。
iOS 锁屏控件不显示上/下曲按钮?检查 UIBackgroundModes 和事件监听
iOS 锁屏界面默认只显示播放/暂停,要出现“上一曲”“下一曲”按钮,必须主动监听并响应系统事件。但前提是原生层已授权——否则连监听都收不到。
- 确保
manifest.json中app-plus.distribute.ios.UIBackgroundModes设为["audio"](不是["playback"]或空数组) - 在初始化后立即绑定事件:
bgAudio.onPrev()和bgAudio.onNext(),不能只靠 UI 按钮触发 - 这两个回调里必须调用新频道的
src并再次play(),否则按钮点击无响应 - 别忘了重设
title、singer、coverImgUrl,否则锁屏信息还是旧的
Android 上切频道后锁屏控件卡住不动?重点查 src 和播放状态
Android 部分机型(华为、小米、OPPO)对后台音频更敏感,常见现象是:点“下一曲”后锁屏界面进度条停住、按钮变灰、实际音频也卡死。
根本原因通常是:
-
src没更新成功——新电台地址必须是 HTTPS 且可直链,本地路径(如/static/radio1.mp3)在后台不可用 - 没等前一个音频真正
ended就调play(),导致底层播放器冲突;建议先bgAudio.stop()再赋新src,最后play() - 未处理
onError事件,错误被吞掉,后续调用全部失效;加个console.error打印err.errMsg很关键 - 某些 ROM 会拦截连续
play()调用,中间加setTimeout(() => bgAudio.play(), 100)可缓解
切频道时封面和标题没更新?coverImgUrl 必须是有效 URL 且带缓存 bust
锁屏界面上的封面图经常“卡在上一个电台”,不是 JS 没执行,而是系统缓存了旧图片 URL。尤其当多个频道共用同一张占位图时,问题更明显。
解决办法很直接:
-
coverImgUrl必须是完整 HTTPS 地址,不能是相对路径或data:URI - 每次切换频道时,在设置新
src前,给coverImgUrl加时间戳参数:https://cdn.example.com/cover.jpg?t=1722860940 - iOS 对图片尺寸有要求(建议 300×300 以上、PNG/JPEG),太小或格式不对会导致锁屏不显示封面
- 别依赖
onPlay后再设封面——得在play()前就全部设好,系统只读取当前值
真机调试时最容易忽略的是:iOS 模拟器不支持锁屏控件,必须用真机 + 云打包验证;Android 则要留意厂商 ROM 对后台服务的限制策略,有些会主动杀掉非前台音频进程。











