繁体   English   中英

如何使用线程通过MPRemoteCommandCenter播放下一首歌曲?

[英]How to use thread to play next song by 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)

我不是英语母语的发烧友,如果您理解我在说什么,非常感谢您在这里阅读:]。 欢迎任何帮助。

对不起,这是我的错。 它不需要任何后台工作。 只需更改如下内容:

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

确保它是AVAudioSessionCategoryPlayback

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM