2016-11-11 2 views
0

Ich möchte mit MPRemoteCommandCenter meine Musik-Player-App steuern. Und jetzt kann es Musik spielen und pausieren, aber kann nächsten/vorherigen Song nicht spielen, nur eine schlechte Chance kann es schaffen.Wie verwende ich den Thread, um den nächsten Song von MPRemoteCommandCenter abzuspielen?

Wenn der Benutzer im MPRemoteCommandCenter auf den nächsten Songknopf klickt (zB im Sperrbildschirm), ruft er die Funktion startExtendBGJob() auf, dann frage ich nach einem Thread, um den Song zu ändern (ich denke, der Bug ist da, weil ich Ich verstehe die Anatomie des Hintergrundjobs nicht vollständig.

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!") 
} 

In startNextPlay() Funktion nur der nächste Song URL zu finden, und prepareToPlay() ist ein neues AVPlayer zum Erstellen nächsten Song zu spielen.

Ich bin nicht Englisch native Spearker, vielen Dank, hier zu lesen, wenn Sie verstehen, worüber ich spreche:]. Jede Hilfe ist willkommen.

Antwort

0

Entschuldigung, es ist meine Schuld. Es braucht keine Hintergrundarbeit. ändern Genau so etwas wie folgt vor:

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

Stellen Sie sicher, es ist AVAudioSessionCategoryPlayback

Verwandte Themen