MPMusicPlayerController的beginGeneratingPlaybackNotifications未触发求助
看起来你遇到的核心问题是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

