我正在使用MPMusicPlayerController在我的应用程序中创建音乐播放器。除了一个小问题,我的所有工作都很好:
当歌曲自然变化时-一首歌曲结束,下一首歌曲从设置的队列开始-通知MPMusicPlayerControllerNowPlayingItemDidChange
似乎没有被调用。
此刻,我同时使用了MPMusicPlayerControllerNowPlayingItemDidChange
和MPMusicPlayerControllerPlaybackStateDidChange
通知。这些包括播放,暂停,随机播放,重复,下一曲,上一曲等。单击通知时,我然后基于MPMusicPlayerController刷新屏幕以显示所需的新歌曲,歌手或其他按钮图标。尽管当歌曲结束并且下一首歌曲自动开始播放时,这两个都不被调用-这意味着将保留前一首歌曲的标题和艺术家,直到用户重新加载屏幕或与音频控件进行交互为止,这不是很好的用户体验。
定期检查当前名称是否与播放名称匹配的简短操作,我不知道如何在应用的正常流程中对其进行更新。
NotificationCenter.default.addObserver(
forName: NSNotification.Name.MPMusicPlayerControllerNowPlayingItemDidChange,
object: musicPlayerController,
queue: nil) { _ in
// Update view
}
答案 0 :(得分:1)
对于这个问题,答案很简单,但是如果您找对地方的话,也很难发现。
在添加观察者之前,我们需要开始生成播放通知:
musicPlayerController.beginGeneratingPlaybackNotifications()
NotificationCenter.default.addObserver(self,
selector: #selector(refreshView),
name: .MPMusicPlayerControllerPlaybackStateDidChange,
object: musicPlayerController)
NotificationCenter.default.addObserver(self,
selector: #selector(refreshView),
name: .MPMusicPlayerControllerNowPlayingItemDidChange,
object: musicPlayerController)
我们还需要记住在离开(释放)视图时结束生成它们:
deinit {
NotificationCenter.default.removeObserver(self, name: .MPMusicPlayerControllerPlaybackStateDidChange, object: nil)
NotificationCenter.default.removeObserver(self, name: .MPMusicPlayerControllerNowPlayingItemDidChange, object: nil)
musicPlayerController.endGeneratingPlaybackNotifications()
}
这个困惑来自于musicMediaPlayer返回的许多通知,即使没有此通知也不表示我们没有观察到所有被触发的通知。
注意:值得注意的是,截至撰写本文时,是否需要手动删除观察者的讨论仍在讨论中-为了完整起见,此处已将其包括在内。