如何监听iOS音乐应用状态变更?订阅通知失败求助
iOS音乐应用状态变更通知无法接收的解决要点
问题重现
已尝试多种订阅方式,但仍无法收到iOS系统音乐应用的播放状态变更通知,实现代码如下:
let musicPlayer = MPMusicPlayerController.systemMusicPlayer let appMusicPlayer = MPMusicPlayerController.applicationMusicPlayer let queuePlayer = MPMusicPlayerController.applicationQueuePlayer func subscribe() { MPMediaLibrary.requestAuthorization { _ in } musicPlayer.beginGeneratingPlaybackNotifications() appMusicPlayer.beginGeneratingPlaybackNotifications() queuePlayer.beginGeneratingPlaybackNotifications() NotificationCenter.default.addObserver(forName: .MPMusicPlayerControllerPlaybackStateDidChange, object: musicPlayer, queue: .main) { [weak self] notification in debugPrint("hello") } NotificationCenter.default.addObserver(forName: .MPMusicPlayerControllerPlaybackStateDidChange, object: appMusicPlayer, queue: .main) { [weak self] notification in debugPrint("hello") } NotificationCenter.default.addObserver(forName: .MPMusicPlayerControllerPlaybackStateDidChange, object: queuePlayer, queue: .main) { [weak self] notification in debugPrint("hello") } NotificationCenter.default.addObserver( self, selector: #selector(playbackStateChanged(_:)), name: .MPMusicPlayerControllerPlaybackStateDidChange, object: musicPlayer ) NotificationCenter.default.addObserver( self, selector: #selector(playbackStateChanged(_:)), name: .MPMusicPlayerControllerPlaybackStateDidChange, object: appMusicPlayer ) NotificationCenter.default.addObserver( self, selector: #selector(playbackStateChanged(_:)), name: .MPMusicPlayerControllerPlaybackStateDidChange, object: queuePlayer ) }
核心问题与解决步骤
聚焦正确的播放器实例
applicationMusicPlayer和applicationQueuePlayer是应用内专属播放器,仅响应自身应用内的播放操作,不会监听系统音乐App的状态变化。只需保留systemMusicPlayer的相关配置,移除另外两个播放器的通知订阅和beginGeneratingPlaybackNotifications调用。确保权限配置完整
- 在
Info.plist中添加NSAppleMusicUsageDescription键,填写合理的权限申请理由(如"需要获取音乐播放状态"),否则授权会直接失败。 - 等待授权结果返回后再初始化播放器和订阅通知,不要调用
requestAuthorization后立即执行后续操作:MPMediaLibrary.requestAuthorization { status in guard status == .authorized else { return } DispatchQueue.main.async { self.musicPlayer.beginGeneratingPlaybackNotifications() self.setupNotifications() } }
- 在
优化通知订阅逻辑
无需同时使用闭包和Selector两种订阅方式,选择一种即可避免冗余。比如保留闭包方式:func setupNotifications() { NotificationCenter.default.addObserver(forName: .MPMusicPlayerControllerPlaybackStateDidChange, object: musicPlayer, queue: .main) { [weak self] _ in debugPrint("播放状态变更") // 在此处理状态变更逻辑 } }保证播放器实例的生命周期
将musicPlayer声明为全局变量或类的属性(如ViewController的属性),确保不会被提前释放,否则通知订阅会失效。正确测试场景
测试时需在系统音乐App中操作播放、暂停、切歌,而非在自身应用内测试,systemMusicPlayer仅同步系统音乐的状态变化。
内容的提问来源于stack exchange,提问作者erotsppa
相关产品推荐
相关产品推荐

