Я хочу использовать 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, спасибо так много, чтобы прочитать здесь, если вы понимаете, о чем я говорю:]. Любая помощь приветствуется.