如何知道MPMusicPlayerController何时自然更改播放项目

时间:2019-01-16 21:21:48

标签: ios swift mpmusicplayercontroller

我正在使用MPMusicPlayerController在我的应用程序中创建音乐播放器。除了一个小问题,我的所有工作都很好:

当歌曲自然变化时-一首歌曲结束,下一首歌曲从设置的队列开始-通知MPMusicPlayerControllerNowPlayingItemDidChange似乎没有被调用。

此刻,我同时使用了MPMusicPlayerControllerNowPlayingItemDidChangeMPMusicPlayerControllerPlaybackStateDidChange通知。这些包括播放,暂停,随机播放,重复,下一曲,上一曲等。单击通知时,我然后基于MPMusicPlayerController刷新屏幕以显示所需的新歌曲,歌手或其他按钮图标。尽管当歌曲结束并且下一首歌曲自动开始播放时,这两个都不被调用-这意味着将保留前一首歌曲的标题和艺术家,直到用户重新加载屏幕或与音频控件进行交互为止,这不是很好的用户体验。

定期检查当前名称是否与播放名称匹配的简短操作,我不知道如何在应用的正常流程中对其进行更新。

NotificationCenter.default.addObserver(
  forName: NSNotification.Name.MPMusicPlayerControllerNowPlayingItemDidChange,
  object: musicPlayerController,
  queue: nil) { _ in
    // Update view
}

1 个答案:

答案 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返回的许多通知,即使没有此通知也不表示我们没有观察到所有被触发的通知。

注意:值得注意的是,截至撰写本文时,是否需要手动删除观察者的讨论仍在讨论中-为了完整起见,此处已将其包括在内。