2016-11-11 3 views
0

Я хочу использовать MPRemoteCommandCenter для управления моим музыкальным плеером. И теперь он может воспроизводить и приостанавливать музыку, но не может воспроизводить следующую/предыдущую песню, только небольшой шанс может это сделать.Как использовать нить для воспроизведения следующей песни от MPRemoteCommandCenter?

Когда пользователь нажимает кнопку следующей песни в MPRemoteCommandCenter (например, на экране блокировки), он вызывает функцию startExtendBGJob(), затем я прошу нить выполнить работу с песней изменения (я думаю, что ошибка здесь, потому что я «Я не совсем понимаю анатомию фоновой работы».

func startExtendBGJob(taskBlock: @escaping() -> Void) { 
    registerBackgroundTask() 
    DispatchQueue.global(qos: .userInitiated).async { 
     DLog("APP into BG") 

     DispatchQueue.global(qos: .default).async { 
      taskBlock() 
     } 
     while self.isPlaying == false || self.tmpPlayer == nil { // waiting for new avplayer been created. 
      Thread.sleep(forTimeInterval: 1) 
     } 
     DispatchQueue.global(qos: .default).asyncAfter(deadline: .now() + 10) { 
      self.endBackgroundTask() 
     } 
    } 
} 

func registerBackgroundTask() { 
    bgIdentifier = UIApplication.shared.beginBackgroundTask(expirationHandler: { 
     [weak self] in 
     guard let strongSelf = self else { return } 
     strongSelf.endBackgroundTask() 
    }) 
    assert(bgIdentifier != UIBackgroundTaskInvalid) 
} 
func endBackgroundTask() { 
    UIApplication.shared.endBackgroundTask(bgIdentifier) 
    bgIdentifier = UIBackgroundTaskInvalid 
    isExtendingBGJob = false 
    DLog("App exit BG!") 
} 

В startNextPlay() функция просто найти URL следующей песне, и prepareToPlay() для создания нового AVPlayer, чтобы играть следующую песню.

self.tmpPlayer = AVPlayer(url: streamURL) 

Я не английский родной spearker, спасибо так много, чтобы прочитать здесь, если вы понимаете, о чем я говорю:]. Любая помощь приветствуется.

ответ

0

Извините, это моя вина. Это не требует никакой работы backgournd. Просто измените что-то вроде следующего:

UIApplication.shared.beginReceivingRemoteControlEvents() 
do { 
      try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
      try AVAudioSession.sharedInstance().setActive(true) 
} catch { 
      DLog("fail to set category: \(error)") 
} 

Убедитесь, что это AVAudioSessionCategoryPlayback