锁屏歌词显示根本不可行,因uni-app的uni.getBackgroundAudioManager()不支持锁屏渲染,iOS/Android系统仅允许title、singer、coverImgUrl等静态元数据;onTimeUpdate锁屏后几乎失效,因系统限制JS执行;唯一可行方案是前台滚动歌词+锁屏保留基础信息。

锁屏歌词显示根本不可行,别被误导
uni-app 的 uni.getBackgroundAudioManager() 本身不支持在锁屏界面上渲染歌词。iOS 和 Android 系统级锁屏控件只接受固定元数据(title、singer、coverImgUrl),不提供自定义文本区域或滚动歌词能力。所谓“锁屏显示歌词”,实际是误把「通知栏媒体控件」或「控制中心卡片」当成锁屏界面——这两处同样无法展示动态歌词,最多显示静态标题+封面。
为什么 onTimeUpdate 在锁屏后几乎失效
锁屏状态下,JavaScript 执行会被系统大幅限制:iOS 会暂停 WebView 线程,Android(尤其华为/小米)会冻结 JS 定时器和事件循环。这意味着即使你绑定了 bgm.onTimeUpdate,回调大概率不会触发,或严重延迟(间隔几十秒才调一次),导致歌词完全不同步。
- 实测现象:
onTimeUpdate在锁屏后 3–5 秒内停止触发,部分机型(EMUI 14、MIUI 14)甚至直接断掉监听 - 替代方案无效:用
setInterval模拟进度更新?锁屏后同样被系统 kill,且无法读取bgm.currentTime(返回 0 或 NaN) - 唯一可靠时间源是 native 层的 MediaSession PlaybackState,但 uni-app 未暴露该能力,JS 层无法访问
能做的真实方案:前台歌词滚动 + 锁屏仅保留基础信息
正确做法是分层处理:前台页面负责实时歌词滚动;锁屏/后台阶段只确保音频持续、元数据可读、控制可用。用户切回 App 后自动恢复歌词同步。
- 前台歌词依赖
bgm.onTimeUpdate+ 时间戳匹配预解析的lyrics数组(每行含time和text),这是唯一可控路径 - 锁屏前必须设置完整元数据:
bgm.title、bgm.singer、bgm.coverImgUrl缺一不可,否则 iOS 控制中心空白,Android 媒体通知不显示 - 不要尝试在锁屏时修改
bgm.lyric字段——该字段不存在,uni.getBackgroundAudioManager()API 根本没有这个属性 - 若需“伪锁屏歌词”,可在通知栏使用
uni.showNotification推送当前歌词行(但 Android 12+ 限制频繁通知,iOS 不允许音频类通知带自定义内容)
容易被忽略的兼容细节
很多项目卡在“前台歌词正常、一锁屏就断”上,问题往往不在代码逻辑,而在构建和权限配置漏项。
- iOS 必须在
manifest.json的app-plus→distribute→ios→UIBackgroundModes中精确写["audio"],拼成"audio "或["Audio"]都会导致后台播放被拒 - Android 的
WAKE_LOCK权限必须用转义 XML 字符串:"<uses-permission android:name=\"android.permission.WAKE_LOCK\" />",少一个反斜杠或引号错位,云打包后权限不生效 - 音频地址必须是 HTTPS(iOS 强制,Android 9+ 默认禁用 HTTP),本地
/static/xxx.mp3在 App 端后台播放时会加载失败,返回err_code: 10001 - 首次播放必须由用户点击等手势触发,
onLoad自动调用play()在 iOS 上静默失败,且不会报错


















