Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
下一首曲目的背景音频在应用程序移动到前台之前不会播放(Swift,iOS8.1)_Ios_Swift_Avfoundation_Soundcloud_Background Audio - Fatal编程技术网

下一首曲目的背景音频在应用程序移动到前台之前不会播放(Swift,iOS8.1)

下一首曲目的背景音频在应用程序移动到前台之前不会播放(Swift,iOS8.1),ios,swift,avfoundation,soundcloud,background-audio,Ios,Swift,Avfoundation,Soundcloud,Background Audio,我正在使用SoundCloudAPI构建一个流媒体音频应用程序。有4个视图控制器,第4个视图控制器是正在播放的曲目VC-类似于音乐应用程序上正在播放的场景 当应用程序位于前台时,一切正常,下一个音频曲目开始正确播放。当应用程序移到后台时,当前曲目将继续播放,但一旦结束,下一首曲目将不会播放,直到我将应用程序移回前台。我已经检查了一系列现有问题,例如,但建议的解决方案都不起作用 我在下面粘贴了用于播放曲目的playTrack方法的代码。当我使用调试器时,我可以看到如果我在下面的闭包中添加一个断点

我正在使用SoundCloudAPI构建一个流媒体音频应用程序。有4个视图控制器,第4个视图控制器是正在播放的曲目VC-类似于音乐应用程序上正在播放的场景

当应用程序位于前台时,一切正常,下一个音频曲目开始正确播放。当应用程序移到后台时,当前曲目将继续播放,但一旦结束,下一首曲目将不会播放,直到我将应用程序移回前台。我已经检查了一系列现有问题,例如,但建议的解决方案都不起作用


我在下面粘贴了用于播放曲目的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
  }
})
}


我已经在Info.plist文件中设置了UIBackgroundModes“audio”值。有人对我做错了什么有什么建议吗

谢谢,
阿披舍克。

好的-所以我想我解决了问题。请看此链接:


由于应用程序注册为背景音频,因此一旦曲目结束,背景音频就会停止,因此,应用程序(位于后台)没有时间完成任何其他任务,即跳到下一个曲目

我还想补充一点,您正在dispatch\u async()调用中设置AVAudioSession category/active和
.beginReceivingRemoteControlEvents()
,这应该在最初设置播放机制时在全局级别上完成(在您的案例中,可能是在viewDidLoad中)


我不是100%确定,但我不认为dispatch\u asyn(dispatch\u get\u main\u queue())甚至会在后台执行?我还没有验证过这一点,但是在后台主队列被挂起是有意义的。尝试完全删除该分派呼叫。不熟悉SCRequest,但如果它类似于AFNetworking,它可能已经在调用主队列上的完成块了。

谢谢-我将试一试。