Фоновый звук для следующего трека не воспроизводится, пока приложение не перейдет на передний план (Swift, iOS8.1)

Я создаю приложение для потокового аудио с помощью SoundCloud API. Есть 4 контроллера представления, и контроллер 4-го представления - это текущий проигрываемый трек VC, аналогичный сцене Now Playing в приложении Music.

Когда приложение находится на переднем плане, все в порядке, и следующая звуковая дорожка начинает воспроизводиться правильно. Когда приложение переходит в фоновый режим, текущая дорожка продолжает воспроизводиться, но как только она заканчивается, следующая дорожка не воспроизводится, пока я не верну приложение на передний план. Я проверил множество существующих проблем, таких как фоновый звук iOS не воспроизводится, но ни один из предложенные решения работают.


Я вставил ниже код метода 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
  }
})

}


Я уже установил значение «audio» UIBackgroundModes в файле Info.plist. Есть ли у кого-нибудь предложения, что я делаю не так?

Спасибо, Абхишек.


person inc_london    schedule 20.02.2015    source источник


Ответы (2)


Хорошо - думаю, я понял проблему. Посмотрите на эту ссылку: target c - Правильное использование beginBackgroundTaskWithExpirationHandler

Поскольку приложение зарегистрировано для фонового звука, как только дорожка заканчивается, фоновый звук останавливается, и в результате приложение (которое находится в фоновом режиме) не получает времени для выполнения каких-либо других задач, то есть перехода к следующей дорожке.

person inc_london    schedule 21.02.2015

Я бы также добавил к этому, что вы устанавливаете категорию AVAudioSession / active и .beginReceivingRemoteControlEvents() внутри вызова dispatch_async (), что действительно должно выполняться на глобальном уровне, когда механизм воспроизведения настроен изначально (так, вероятно, в вашем viewDidLoad в вашем случае ).

Я не уверен на 100%, но не думаю, что dispatch_asyn (dispatch_get_main_queue ()) даже будет выполняться в фоновом режиме? Ни в коем случае не проверял это, но имеет смысл, что основная очередь приостанавливается в фоновом режиме. Попробуйте полностью удалить этот вызов диспетчеризации. Не знаком с SCRequest, но он может уже вызывать этот блок завершения в основной очереди, если он похож на AFNetworking.

person manderson    schedule 27.02.2015
comment
Спасибо - я попробую. - person inc_london; 01.03.2015