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

How to know when MPMusicPlayerController changes playing item naturally

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

当歌曲自然变化时 - 一首歌曲结束,下一首歌曲从集合 queue 开始 - 通知 MPMusicPlayerControllerNowPlayingItemDidChange 似乎没有被调用。

目前我正在使用 MPMusicPlayerControllerNowPlayingItemDidChangeMPMusicPlayerControllerPlaybackStateDidChange 通知。这些包括播放、暂停、随机播放、重复、下一首、上一首等。当通知被点击时,我然后根据 MPMusicPlayerController 刷新屏幕以显示新歌曲、艺术家或所需的不同按钮图标。尽管当一首歌曲结束并且下一首自动开始播放时,这两个都不会被调用——这意味着前一首歌曲的标题和艺术家将被保留,直到用户重新加载屏幕或与音频控件交互,这不是好的用户体验。

没有定期检查当前名称是否与播放名称匹配我不知道如何在应用程序的正常流程中更新。

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

事实证明,这个问题的答案非常简单,但如果您没有找对地方,也很难发现。

在添加观察者之前,我们需要开始生成播放通知:

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 返回的一些通知,即使没有这个也没有指出我们没有观察到所有被触发的通知。

注意:值得注意的是,在撰写本文时,正在讨论是否需要手动删除观察者 - 我已将其包含在这里以供回答完整性。