答案是iOS锁屏封面空白源于系统级MPMediaItem元数据缺失,需通过uni.setBackgroundAudioState手动注入coverUrl等字段,并确保HTTPS图片可达、permissions.audio已声明、且在真实播放后调用。

uni-app 的 video 组件在 iOS 锁屏控制中心(Now Playing)不显示封面,根本不是 poster 没配对,而是系统级元数据缺失导致的。 即使 poster 在页面内正常渲染,锁屏界面仍为空白——这是 Apple 对后台媒体播放的强制要求,与 uni-app 渲染无关,必须通过原生层补充 MPMediaItem 元数据才能生效。
video 播放时锁屏封面空白的真正原因
iOS 的锁屏控制中心不读取网页或 WebView 中的 poster 属性,它只信任 AVFoundation 框架注入的媒体元数据。uni-app 的 <video> 组件在 App 端(iOS)底层使用的是 AVPlayer,但默认不会自动填充封面、标题、艺术家等字段。一旦视频进入后台播放(比如按 Home 键),系统就因缺少 MPMediaItem 而显示空白封面。
- 现象:真机播放中按 Home 键 → 锁屏 → 控制中心显示“无封面”+默认音频图标
- 验证方式:在 Xcode 中运行打包后的 IPA,用
po [MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo查看是否为空字典 - 注意:H5 和小程序完全不支持此功能,该问题仅存在于
app-plus(iOS 原生 App)平台
必须修改 nativeplugins 配置启用媒体元数据支持
uni-app 默认关闭了 iOS 媒体元数据上报,需手动开启并配置插件行为。否则即使 JS 层调用 uni.setBackgroundAudioState 也无效。
- 打开
nativePlugins.json(位于项目根目录或nativeplugin/下) - 找到
"ios": { "plugins": [...] }部分,确认已包含"mediaSession"插件(uni-app 3.9.0+ 自带,旧版需手动添加) - 在
manifest.json的"app-plus"节点下,添加或确认以下配置:
{
"permissions": {
"audio": {
"description": "用于后台播放和锁屏控制"
}
}
}
缺 permissions.audio 会导致系统拒绝注册媒体会话,封面始终为空。
播放时动态设置 nowPlayingInfo(关键一步)
仅配置插件不够,必须在 JS 层主动写入元数据。不能依赖 poster 自动同步,需调用原生能力手动填充。
- 在开始播放时(如
@play或uni.createInnerAudioContext()后),立即执行:
if (uni.getSystemInfoSync().platform === 'ios') {
uni.setBackgroundAudioState({
title: '歌曲名',
epname: '专辑名',
singer: '歌手',
coverUrl: 'https://example.com/cover.jpg', // 必须是 HTTPS 纯图片 URL,不支持本地路径或 base64
webUrl: 'https://example.com', // 可选,点击封面跳转地址
duration: 240 // 总时长(秒),必须为 number 类型
});
}
-
coverUrl必须可被 iOS 直接加载:不能是/static/xxx.jpg,不能是data:image/...,不能跨域未开 CORS - 若封面图加载失败,控制中心仍为空白,但不会报错——需用 Safari 远程调试检查 Network 面板中该图片是否返回 200
- 每次切换歌曲必须重新调用
uni.setBackgroundAudioState,否则封面不会更新
常见踩坑点:为什么设置了还是空白
最常被忽略的是三类硬性限制,任一不满足都会导致封面失效:
-
coverUrl使用了 HTTP 协议 → iOS 强制拦截,必须 HTTPS - 图片尺寸非正方形(推荐 600×600 或 1024×1024)→ 部分 iOS 版本会降级为默认图标
- App 启动后未触发任何音频播放就调用
setBackgroundAudioState→ 系统拒绝写入,需确保audioContext.play()或video.play()已成功执行 - 在 H5 或微信小程序环境误调用该 API → 无效果且可能报错,应加平台判断
锁屏封面不是 UI 渲染问题,而是原生媒体会话的元数据注册问题。没看到封面,第一反应不该是改 CSS 或重写 poster,而应检查 coverUrl 是否可达、permissions.audio 是否声明、以及 setBackgroundAudioState 是否在真实播放后调用。


















