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

MPMusicPlayerController的beginGeneratingPlaybackNotifications未触发求助

解决MPMusicPlayerController通知未触发的问题

看起来你遇到的核心问题是MPMusicPlayerController的播放通知没有触发refreshView方法,我帮你梳理几个关键排查点和修复方案:

1. 修正通知观察者的object参数

你当前注册通知时把object设为self,但播放通知是由MPMusicPlayerController实例发出的,不是你的视图控制器。这会导致通知中心无法匹配到正确的发送者,自然不会调用你的方法。

修改注册代码,把object指定为你正在使用的player实例:

let player = MPMusicPlayerController.applicationQueuePlayer 

// 先开启通知生成
player.beginGeneratingPlaybackNotifications()

// 注册通知时指定正确的object
NotificationCenter.default.addObserver(
    self, 
    selector: #selector(refreshView), 
    name: .MPMusicPlayerControllerPlaybackStateDidChange, 
    object: player
)
NotificationCenter.default.addObserver(
    self, 
    selector: #selector(refreshView), 
    name: .MPMusicPlayerControllerNowPlayingItemDidChange, 
    object: player
)

如果想监听所有播放器的通知,可以把object设为nil,但更推荐指定具体的播放器实例,避免不必要的回调。

2. 确保播放器实例的一致性

你尝试了调用所有类型播放器的beginGeneratingPlaybackNotifications(),但实际只在使用applicationQueuePlayer播放。没必要开启多个播放器的通知,只需要针对你正在使用的player调用一次即可,避免混淆。

3. 检查权限配置

虽然音乐能播放,但缺少权限描述可能导致部分功能异常。在Info.plist中添加NSAppleMusicUsageDescription键,填写访问Apple Music的理由(比如"需要访问您的音乐库以播放和管理音乐"),这是iOS要求的隐私权限声明。

4. 验证refreshView是否被触发

在refreshView方法里加个打印语句,确认是否真的没被调用:

@objc func refreshView(){
    print("🔔 refreshView 被调用了!")
    let nowPlaying = player.nowPlayingItem
    // 后续处理逻辑
}

如果打印没出现,说明通知确实没触发;如果打印出现,那问题出在后续逻辑。

5. 增加音频会话激活(可选但推荐)

有时候音频会话未激活会影响播放相关的通知触发,在播放前激活AVAudioSession:

import AVFoundation

// 在player.play()之前添加
do {
    try AVAudioSession.sharedInstance().setActive(true)
} catch {
    print("激活音频会话失败: \(error)")
}

player.play()

6. 清理观察者(避免内存泄漏)

记得在视图控制器销毁时移除观察者并停止通知生成:

deinit {
    NotificationCenter.default.removeObserver(self)
    player.endGeneratingPlaybackNotifications()
}

先从第1点开始修正,这是最常见的错误点,大概率能解决你的问题。如果还是不行,再逐一排查其他点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:47:34