使用MPMusicPlayerApplicationController时如何更新MPNowPlayingInfoCenter
如何更新MPNowPlayingInfoCenter显示Apple Music曲目信息
嘿,你已经把最关键的基础配置搞定了——后台模式和AVAudioSession的设置确实是MPNowPlayingInfoCenter正常工作的必要前提!接下来咱们把剩下的步骤补全,就能让锁屏和控制中心准确显示Apple Music的曲目信息了。
第一步:导入必要的框架
首先确保你在代码文件顶部导入MediaPlayer和AVFoundation这两个核心框架:
import MediaPlayer import AVFoundation
第二步:监听Apple Music的播放状态与曲目变化
我们可以利用系统提供的MPMusicPlayerController.systemMusicPlayer来获取全局的Apple Music播放状态,然后通过监听通知来实时更新播放信息:
class AudioPlaybackManager { private let systemMusicPlayer = MPMusicPlayerController.systemMusicPlayer init() { // 注册曲目变更通知 NotificationCenter.default.addObserver( self, selector: #selector(updateNowPlayingMetadata), name: .MPMusicPlayerControllerNowPlayingItemDidChange, object: systemMusicPlayer ) // 注册播放状态变更通知(比如播放/暂停切换) NotificationCenter.default.addObserver( self, selector: #selector(updateNowPlayingMetadata), name: .MPMusicPlayerControllerPlaybackStateDidChange, object: systemMusicPlayer ) // 启动播放状态的通知生成 systemMusicPlayer.beginGeneratingPlaybackNotifications() } deinit { // 记得在销毁时清理通知,避免内存泄漏 NotificationCenter.default.removeObserver(self) systemMusicPlayer.endGeneratingPlaybackNotifications() } @objc private func updateNowPlayingMetadata() { guard let currentTrack = systemMusicPlayer.nowPlayingItem else { // 没有正在播放的曲目时,清空显示信息 MPNowPlayingInfoCenter.default().nowPlayingInfo = nil return } // 组装播放信息字典 var playbackInfo = [String: Any]() // 核心曲目信息 playbackInfo[MPMediaItemPropertyTitle] = currentTrack.title playbackInfo[MPMediaItemPropertyArtist] = currentTrack.artist playbackInfo[MPMediaItemPropertyAlbumTitle] = currentTrack.albumTitle // 播放进度与状态 playbackInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = systemMusicPlayer.currentPlaybackTime playbackInfo[MPMediaItemPropertyPlaybackDuration] = currentTrack.playbackDuration playbackInfo[MPNowPlayingInfoPropertyPlaybackRate] = systemMusicPlayer.playbackRate // 专辑封面处理 if let artwork = currentTrack.artwork { // 获取合适尺寸的封面图(这里用300x300适配大多数场景) let coverImage = artwork.image(at: CGSize(width: 300, height: 300)) ?? UIImage() playbackInfo[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(boundsSize: coverImage.size) { requestedSize in return coverImage } } // 更新到NowPlayingInfoCenter MPNowPlayingInfoCenter.default().nowPlayingInfo = playbackInfo } }
第三步:(可选但推荐)支持远程控制操作
如果想要让锁屏上的播放/暂停、切歌按钮能正常控制Apple Music,还需要添加远程控制事件的处理逻辑:
// 可以放在你的主ViewController或者AppDelegate中 override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // 开始接收远程控制事件 UIApplication.shared.beginReceivingRemoteControlEvents() becomeFirstResponder() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) // 停止接收远程控制事件 UIApplication.shared.endReceivingRemoteControlEvents() resignFirstResponder() } override func remoteControlReceived(with event: UIEvent?) { guard let event = event, event.type == .remoteControl else { return } switch event.subtype { case .remoteControlPlay: MPMusicPlayerController.systemMusicPlayer.play() case .remoteControlPause: MPMusicPlayerController.systemMusicPlayer.pause() case .remoteControlNextTrack: MPMusicPlayerController.systemMusicPlayer.skipToNextItem() case .remoteControlPreviousTrack: MPMusicPlayerController.systemMusicPlayer.skipToPreviousItem() default: break } } override var canBecomeFirstResponder: Bool { return true }
额外注意事项
- 权限配置:别忘了在Info.plist中添加
NSAppleMusicUsageDescription键,填写访问媒体库的原因(比如"需要访问媒体库以展示Apple Music的播放信息"),否则App会被拒绝访问媒体库。 - 测试环境:建议在真实iOS设备上测试,模拟器对Apple Music的功能支持有限,可能无法正常获取播放信息。
内容的提问来源于stack exchange,提问作者Wayne Hartman
相关产品推荐
相关产品推荐

