AVPlayer 不在后台切换 AVPlayerItems

AVPlayer not switching AVPlayerItems in background

我正在尝试为 SoundCloud 制作一个自定义播放器,因为在 Swift-iOS(前进和后退)功能中没有对完整播放器的本地支持;然后我决定使用 AVPlayer 而不是 AVQueuePlayer。

我有一个曲目 class,其中包含关于我的曲目(Url)的相关信息。一个 TracksQueue,其中包含有关队列的相关信息 - 多个轨道,如果我可以通过检查轨道数组的数组索引来转发或反转逻辑。

我还在应用程序设置中启用了后台模式,并添加了以下代码,正如许多人建议的那样,当应用程序在我的 ViewController 的 viewDidLoad()

中启动时这样做
UIApplication.shared.beginReceivingRemoteControlEvents()

一切都按预期进行,但唯一的问题是曲目在背景中会发生变化,但无法播放。

我所做的就是从 AVPlayer 中移除观察者并启动一个新的观察者,并在收到 NSNotification.Name.AVPlayerItemDidPlayToEndTime 通知后用新的 AVPlayerItem 替换当前项目。

fileprivate func restartCurrentTrack() {
    if (player != nil) {
            player?.removeObserver(self, forKeyPath: Keys.Status, context: &PGAudioPlayerManagetKVOContext)
    }

    if let _currentTrack = queue.currentTrack {
        player = AVPlayer()
        player.addObserver(self, forKeyPath: Keys.Status, options: NSKeyValueObservingOptions.new, context: &PGAudioPlayerManagetKVOContext)
        if let _playerItem = _currentTrack.getPlayerItem() {
            player?.replaceCurrentItem(with: _playerItem)
        }
    }
}

编辑 1:我找到了当应用程序进入后台时游戏没有发生的原因之一。我有 KVO,它通过检查播放器的状态告诉我播放器何时准备播放。只有当我收到同样的东西时,我才开始

player.play()

但是当应用程序处于后台时,它不再收到此通知。有没有什么方法可以让我在应用程序处于后台时也能收到通知?

编辑 2:澄清一下,如果音乐从前台开始播放,应用程序会播放音乐。问题是在后台更改曲目是当播放器就绪的 KVO 永远不会被触发时,除非我将应用程序带到前台。

我在下面使用了SO上提供的信息post