前言
MPNowPlayingInfoCenter 是 iOS 框架 MediaPlayer 中的一个类,主要用于管理锁屏界面、控制中心、通知中心中显示的“当前播放”媒体信息。它允许开发者向用户展示正在播放的音乐或媒体信息,并控制媒体播放。
通过 MPNowPlayingInfoCenter,你可以在锁屏上显示诸如歌曲标题、艺术家、专辑封面、播放进度等信息,同时还可以提供播放、暂停、快进等媒体控制。
本篇文章简单介绍一下 MPNowPlayingInfoCenter 以及用法。
1. nowPlayingInfo 属性
nowPlayingInfo 是一个字典,你可以通过它设置锁屏和控制中心显示的媒体信息。这个字典中的键值对指定了要展示的媒体元数据,比如标题、艺术家、专辑封面等。
MPNowPlayingInfoCenter.default().nowPlayingInfo = [MPMediaItemPropertyTitle: "Song Title",MPMediaItemPropertyArtist: "Artist Name",MPMediaItemPropertyAlbumTitle: "Album Name",MPNowPlayingInfoPropertyElapsedPlaybackTime: 0, // 当前播放的时间MPMediaItemPropertyPlaybackDuration: 200, // 媒体总时长MPNowPlayingInfoPropertyPlaybackRate: 1.0 // 播放速率,1.0表示正常播放,0.0表示暂停
]
常用的键值:
- MPMediaItemPropertyTitle: 媒体的标题(如歌曲名)。
- MPMediaItemPropertyArtist: 艺术家名。
- MPMediaItemPropertyAlbumTitle: 专辑名。
- MPMediaItemPropertyArtwork: 封面图片(使用 MPMediaItemArtwork 对象)。
- MPNowPlayingInfoPropertyElapsedPlaybackTime: 当前播放时间。
- MPNowPlayingInfoPropertyPlaybackRate: 播放速率(1.0 为正常播放,0.0 为暂停)。
2. 更新封面图片
MPMediaItemPropertyArtwork 可以用来设置媒体的封面图片。苹果文档建议使用 MPMediaItemArtwork 来处理动态图片大小调整,这样系统在不同场景下会自动调整封面的大小。
if let image = UIImage(named: "albumCover") {let artwork = MPMediaItemArtwork(boundsSize: image.size) { size inreturn image}nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork
}
- 如何将网络图片设置成封面
使用Kingfisher 框架
//下载图片KingfisherManager.shared.retrieveImage(with: albumArtURL) { result inswitch result {case .success(let imageResult):updateArtwork(imageResult.image)case .failure(let error)://默认if let defaultImage = UIImage(named: "albumCover") {updateArtwork(defaultImage)}print("下载封面图失败: \(error.localizedDescription)")}}// MARK: - 更新封面图func updateArtwork(_ image: UIImage) {guard var nowPlayingInfo = MPNowPlayingInfoCenter.default().nowPlayingInfo else { return }let artwork = MPMediaItemArtwork(boundsSize: image.size) { _ inreturn image}nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork// 更新锁屏信息MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo}
3. 更新播放进度和速率
MPNowPlayingInfoCenter 的 nowPlayingInfo 不仅可以设置媒体元数据,还可以动态更新播放进度和播放状态。
- 进度更新:通过 MPNowPlayingInfoPropertyElapsedPlaybackTime 来更新当前播放的时间。
- 播放速率:使用 MPNowPlayingInfoPropertyPlaybackRate 更新播放速率,1.0 表示正在播放,0.0 表示暂停。
MPNowPlayingInfoCenter.default().nowPlayingInfo?[MPNowPlayingInfoPropertyElapsedPlaybackTime] = currentTime
MPNowPlayingInfoCenter.default().nowPlayingInfo?[MPNowPlayingInfoPropertyPlaybackRate] = isPlaying ? 1.0 : 0.0
4. 响应远程控制事件
除了显示媒体信息,MPNowPlayingInfoCenter 通常与 MPRemoteCommandCenter 配合使用,来响应锁屏界面上的播放、暂停等媒体控制按钮。你可以为这些按钮设置相应的事件处理逻辑。
let commandCenter = MPRemoteCommandCenter.shared()commandCenter.playCommand.addTarget { [weak self] event in// 播放事件self?.play()return .success
}commandCenter.pauseCommand.addTarget { [weak self] event in// 暂停事件self?.pause()return .success
}
5. 清除锁屏信息
如果你不再需要显示锁屏信息,可以将 MPNowPlayingInfoCenter 的 nowPlayingInfo 设置为 nil 来清除当前的媒体信息。
MPNowPlayingInfoCenter.default().nowPlayingInfo = nil
示例代码:音乐播放器锁屏信息管理
import MediaPlayerclass MusicPlayer {func play() {// 播放音乐// audioStreaming.play(url: track.url)// 初始化锁屏信息setupNowPlayingInfo(track: track)}func pause() {// audioStreaming.pause()// 更新锁屏信息updatePlaybackProgress(currentTime: audioStreaming.progress,isPlaying: false )}func resume() {//继续//audioStreaming.resume// 更新锁屏信息updatePlaybackProgress(currentTime: audioStreaming.progress,isPlaying: true)}func setupNowPlayingInfo(track: Track) {var nowPlayingInfo = [String: Any]()nowPlayingInfo[MPMediaItemPropertyTitle] = track.titlenowPlayingInfo[MPMediaItemPropertyArtist] = track.artistnowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = track.durationnowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = 0 // 初始播放时间nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = 1.0 // 正在播放if let albumArt = track.albumArt {let artwork = MPMediaItemArtwork(boundsSize: albumArt.size) { size inreturn albumArt}nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork}MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo}func updatePlaybackProgress(currentTime: TimeInterval, isPlaying: Bool) {guard var nowPlayingInfo = MPNowPlayingInfoCenter.default().nowPlayingInfo else { return }nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = currentTimenowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = isPlaying ? 1.0 : 0.0MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo}}
实现功能:
- 设置锁屏信息:通过 setupNowPlayingInfo 设置播放曲目的相关信息。
- 更新播放进度:updatePlaybackProgress 方法根据播放状态动态更新播放进度。
参考文档
- MPNowPlayingInfoCenter | Apple Developer Documentation
感谢您的阅读和参与,HH思无邪愿与您一起在技术的道路上不断探索。如果您喜欢这篇文章,不妨留下您宝贵的赞!如果您对文章有任何疑问或建议,欢迎在评论区留言,我会第一时间处理,您的支持是我前行的动力,愿我们都能成为更好的自己!