You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:13:32