2016-11-11 10 views
0

私はMPRemoteCommandCenterを使って音楽プレーヤーのアプリケーションをコントロールしたいと思います。そして今、音楽を演奏して一時停止することができますが、次の/前の曲を再生することはできません。スレッドを使用して次の曲をMPRemoteCommandCenterで再生する方法

ユーザーがMPRemoteCommandCenterの次の曲ボタンをタップすると(ロック画面など)、startExtendBGJob()関数が呼び出されます。その後、スレッドを変更して曲のジョブを実行するように要求します。バックグラウンドジョブの解剖学を完全に理解していない)。 startNextPlay()関数で

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

だけで次の曲のURLを見つけ、そしてprepareToPlayは()次の曲を再生するための新しいAVPlayerを作成するためです。

self.tmpPlayer = AVPlayer(url: streamURL) 

私は、英語のネイティブspearkerないんだけど、あなたは私が話しているものを理解していれば、ここで読むことをあなたにそんなに感謝:]。どんな助けも歓迎です。

答えて

0

申し訳ありませんが、それは私のせいです。バックグラウンドの仕事は必要ありません。 ただ、次のようなものを変更します。

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

それはAVAudioSessionCategoryPlayback

だことを確認してください
関連する問題