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

如何监听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
    )
}

核心问题与解决步骤

  1. 聚焦正确的播放器实例
    applicationMusicPlayer和applicationQueuePlayer是应用内专属播放器,仅响应自身应用内的播放操作,不会监听系统音乐App的状态变化。只需保留systemMusicPlayer的相关配置,移除另外两个播放器的通知订阅和beginGeneratingPlaybackNotifications调用。

  2. 确保权限配置完整

    • 在Info.plist中添加NSAppleMusicUsageDescription键,填写合理的权限申请理由(如"需要获取音乐播放状态"),否则授权会直接失败。
    • 等待授权结果返回后再初始化播放器和订阅通知,不要调用requestAuthorization后立即执行后续操作:
      MPMediaLibrary.requestAuthorization { status in
          guard status == .authorized else { return }
          DispatchQueue.main.async {
              self.musicPlayer.beginGeneratingPlaybackNotifications()
              self.setupNotifications()
          }
      }
      
  3. 优化通知订阅逻辑
    无需同时使用闭包和Selector两种订阅方式,选择一种即可避免冗余。比如保留闭包方式:

    func setupNotifications() {
        NotificationCenter.default.addObserver(forName: .MPMusicPlayerControllerPlaybackStateDidChange, object: musicPlayer, queue: .main) { [weak self] _ in
            debugPrint("播放状态变更")
            // 在此处理状态变更逻辑
        }
    }
    
  4. 保证播放器实例的生命周期
    将musicPlayer声明为全局变量或类的属性(如ViewController的属性),确保不会被提前释放,否则通知订阅会失效。

  5. 正确测试场景
    测试时需在系统音乐App中操作播放、暂停、切歌,而非在自身应用内测试,systemMusicPlayer仅同步系统音乐的状态变化。

内容的提问来源于stack exchange,提问作者erotsppa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:05:27