我正在使用SoundCloud API构建流媒体音频应用。有4个视图控制器,第4个视图控制器是正在播放的音轨VC - 类似于音乐应用程序上的正在播放场景。
当应用程序位于前台时,一切正常,下一个音轨开始正常播放。当应用程序移动到后台时,当前轨道会继续播放,但是一旦它结束,下一个轨道就不会播放,直到我将应用程序带回前台。我检查了一些现有问题,例如iOS background audio not playing,但没有一个建议的解决方案有效。
我已经粘贴在用于播放曲目的playTrack方法的代码下方。当我使用调试器时,我可以看到,如果我在下面的闭包内添加断点,则在应用程序进入前台之前不会触发断点。
func playTrack(track: SongSearchResult) {
println("Playing track: \(track.title)")
Logging.sharedInstance.writeData(String(format: "%@:Playing track(%@)", __FUNCTION__, track.title))
audioPlayer?.stop()
if playPauseButton.enabled == false {
if let request: AnyObject = currentGetRequest {
SCRequest.cancelRequest(request)
}
}
currentGetRequest = SCRequest.performMethod(SCRequestMethodGET,
onResource: NSURL(string: track.streamURL),
usingParameters: nil,
withAccount: SCSoundCloud.account(),
sendingProgressHandler: nil,
responseHandler: {(response, data, error) in
dispatch_async(dispatch_get_main_queue()) {
var playerError: NSError? -----------------> BREAKPOINT SET HERE
AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil)
AVAudioSession.sharedInstance().setActive(true, error: nil)
UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
self.audioPlayer = AVAudioPlayer(data: data, error: &playerError)
self.audioPlayer?.delegate = self
self.delegate?.currentTrackChanged(self)
self.audioPlayer?.prepareToPlay()
self.audioPlayer?.play()
self.timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("updateTime:"), userInfo: nil, repeats: true)
self.playPauseButton.enabled = true
self.currentTimeSlider.enabled = true
}
})
}
我已经设置了UIBackgroundModes' audio' Info.plist文件中的值。有人对我做错了什么有任何建议吗?
谢谢, 阿布舍克巴克。
答案 0 :(得分:0)
好的 - 所以我想我找出了问题所在。请看这个链接:objective c - Proper use of beginBackgroundTaskWithExpirationHandler
因为应用程序是为背景音频注册的,所以一旦音轨结束,背景音频就会停止,因此应用程序(在后台)没有时间完成任何其他任务,即跳到下一个跟踪。
答案 1 :(得分:0)
我还要补充一点,你在dispatch_async()调用中设置AVAudioSession类别/ active和.beginReceivingRemoteControlEvents()
,这应该在最初设置回放机制时在全局级别上完成(所以可能在你的viewDidLoad中你的情况)。
我不是百分百肯定,但我不认为dispatch_asyn(dispatch_get_main_queue())甚至会在后台执行?没有以任何方式验证这一点,但主队列在后台暂停时会有意义。尝试完全删除该调度调用。不熟悉SCRequest,但如果它与AFNetworking类似,它可能已经在主队列上调用了完成块。