为什么AVPlayer在后台不能继续播放下一首歌?

我一直使用AVPlayer从远程来源播放音乐。 我得到的URL,使用一个创build一个AVPlayerItem,然后我与AVPlayer的实例关联。 我将一个观察者添加到与播放器关联的项目中,以观察项目何时完成播放( AVPlayerItemDidPlayToEndTimeNotification )。 当观察者在项目结束时通知我时,然后创build一个新的AVPlayerItem并重新执行。 这在iOS 9.2的前台和后台运行良好。

问题:由于我已经更新到iOS 9.3,这在后台不起作用。 这是相关的代码:

 var portionToBurffer = Double() var player = AVPlayer() func prepareAudioPlayer(songNSURL: NSURL, portionOfSongToBuffer: Double){ self.portionToBuffer = portionOfSongToBuffer //create AVPlayerItem let createdItem = AVPlayerItem(URL: songNSURL) //Associate createdItem with AVPlayer player = AVPlayer(playerItem: createdItem) //Add item end observer NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerItemDidReachEnd:", name: AVPlayerItemDidPlayToEndTimeNotification, object: player.currentItem) //Use KVO to see how much is loaded player.currentItem?.addObserver(self, forKeyPath: "loadedTimeRanges", options: .New, context: nil) } override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { if keyPath == "loadedTimeRanges" { if let loadedRangeAsNSValueArray = player.currentItem?.loadedTimeRanges { let loadedRangeAsCMTimeRange = loadedRangeAsNSValueArray[0].CMTimeRangeValue let endPointLoaded = CMTimeRangeGetEnd(loadedRangeAsCMTimeRange) let secondsLoaded = CMTimeGetSeconds(endPointLoaded) print("the endPointLoaded is \(secondsLoaded) and the duration is \(CMTimeGetSeconds((player.currentItem?.duration)!))") if secondsLoaded >= portionToBuffer { player.currentItem?.removeObserver(self, forKeyPath: "loadedTimeRanges") player.play() } } } } func playerItemDidReachEnd(notification: NSNotification){ recievedItemEndNotification() } func recievedItemEndNotification() { //register background task bgTasker.registerBackgroundTask() if session.playlistSongIndex == session.playlistSongTitles.count-1 { session.playlistSongIndex = 0 } else { session.playlistSongIndex += 1 } prepareAudioPlayer(songURL: session.songURLs[session.playlistSongIndex], portionOfSongToBuffer: 30.00) } 

我已经设置了断点来查看player.play()在后台被调用。 当我打印player.rate它读取0.0 。 我已经检查AVPlayerItem的属性playbackLikelyToKeepUp ,这是true 。 我也确认了新的URL已成功用于创build新的AVPlayerItem,并在应用程序在后台时与AVPlayer相关联。 我已经打开了audio和播放的背景function,我甚至打开了一个有限长度的后台任务(在上面的代码为bgTasker.registerBackgroundTask )。 不知道发生了什么事。

我发现了这一点,但我不确定它有帮助。 任何build议将是伟大的,谢谢

当观察者在项目结束时通知我时,然后创build一个新的AVPlayerItem并重新执行

但问题在于,同时播放停止,规则是只有在前台播放,后台播放时才允许后台播放。

我会build议使用AVQueuePlayer而不是AVPlayer。 这将允许你在当前项目还在播放的时候排队下一个项目 – 因此,我们可能希望,这将被视为继续播放。