iOS音频应用锁屏与控制中心未正确显示播放信息求助
iOS音频应用锁屏/控制中心信息不显示问题排查
问题描述
使用SwiftUI、AVFoundation、MediaPlayer和ActivityKit开发iOS音频播放应用,PlayAudioService类负责音频播放、后台播放、锁屏控制及播放信息更新。应用可正常后台播放,但锁屏和控制中心始终无法正确显示播放信息或控制按钮。日志确认updateNowPlayingInfo()已调用,且MPNowPlayingInfoCenter的nowPlayingInfo字典包含预期值,但界面无更新。
相关代码
func updateNowPlayingInfo() { print("Updating playback info") DispatchQueue.main.async { if let player = self.player { var nowPlayingInfo = [String: Any]() nowPlayingInfo[MPMediaItemPropertyTitle] = self.trackTitle nowPlayingInfo[MPMediaItemPropertyArtist] = "Artist Name" nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = player.duration nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = player.currentTime if let albumArt = self.albumArt { let artwork = MPMediaItemArtwork(boundsSize: albumArt.size) { _ in return albumArt } nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork } MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo print(MPNowPlayingInfoCenter.default().nowPlayingInfo ?? "No Now Playing Info") } } }
日志验证(数据已正确设置)
[ "MPNowPlayingInfoPropertyElapsedPlaybackTime": 51.41918367346939, "artist": "Artist Name", "artwork": <MPMediaItemArtwork: 0x3039f7560>, "playbackDuration": 728.6668027210884, "title": "84ABB1F1-AA30-45A1-BEE9-B22363EE79D2.mp3" ]
排查与解决方法
1. 未注册远程控制事件
iOS要求音频应用主动注册远程控制事件,否则锁屏/控制中心控件无法生效,也会影响信息显示。在播放启动时添加:
UIApplication.shared.beginReceivingRemoteControlEvents()
停止播放或应用退后台时,记得调用:
UIApplication.shared.endReceivingRemoteControlEvents()
2. 音频会话配置不完整
即使能后台播放,不完整的音频会话配置会导致系统无法正确识别播放状态。初始化时确保配置正确:
let session = AVAudioSession.sharedInstance() do { try session.setCategory(.playback, mode: .default, options: [.mixWithOthers, .allowAirPlay]) try session.setActive(true) } catch { print("音频会话配置失败: \(error)") }
同时检查Info.plist中已添加UIBackgroundModes并勾选audio项。
3. MPMediaItemArtwork初始化方式兼容问题
iOS 13+推荐使用image:初始化器,闭包方式在部分场景下无法正确渲染。修改artwork创建代码:
if let albumArt = self.albumArt { let artwork = MPMediaItemArtwork(image: albumArt) nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork }
4. 未同步播放状态给系统
播放状态(播放/暂停/进度)变更时,需主动通知系统:
- 切换播放/暂停时:
MPNowPlayingInfoCenter.default().playbackState = player.isPlaying ? .playing : .paused - 进度更新时,同步播放速率:
nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = player.rate
5. ActivityKit抢占优先级
若使用Live Activity,可能抢占锁屏媒体控件优先级。可在播放时暂时隐藏Live Activity,或调整其配置确保媒体播放优先级更高。
6. 系统缓存或环境问题
- 重启测试设备,清除系统媒体信息缓存。
- 确保测试设备iOS版本与开发SDK版本匹配,旧版系统对
MPNowPlayingInfoCenter更新逻辑有差异。
内容的提问来源于stack exchange,提问作者Mango Cat
相关产品推荐
相关产品推荐

