【问题标题】:How to know when MPMusicPlayerController changes playing item naturally如何知道 MPMusicPlayerController 何时自然更改播放项目
【发布时间】:2019-01-16 21:21:48
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ios swift mpmusicplayercontroller


    【解决方案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 返回的一些通知,即使没有这个,这并没有指出我们没有观察到所有被触发的通知这一事实。

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

    【讨论】:

    • MPMusicPlayerControllerNowPlayingItemDidChange 从 iPhone 锁定屏幕跳过歌曲时似乎没有被调用。您是否遇到过这个问题/找到了解决方法?
    • 我发现这个功能在我开始工作后会自动运行,没有任何问题
    猜你喜欢
    • 2014-05-19
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    相关资源
    最近更新 更多