我正在开发使用Swift
编写的音乐播放器应用程序,并使用AVPlayer
进行音频流播放,一切都很好
但是当我尝试将MPRemoteCommandCenter添加到我的应用程序时,我什至不知道为什么会发生很多错误
link to video that describes my problem
func setupPlayer() {
let item = AVPlayerItem(url: musicURL)
self.player = AVPlayer.init(playerItem: item)
self.player.play()
self.player.volume = 1
self.player.addPeriodicTimeObserver(forInterval: CMTimeMakeWithSeconds(1, preferredTimescale: 1), queue: DispatchQueue.main, using: { (time) in
if self.player.currentItem?.status == .readyToPlay {
self.reloadNowPlayingInfo()
let currentTime = self.player.currentTime().seconds
self.playingTime.text = currentTime.getTimeString()
self.playerSlider.value = currentTime/duration
}
})
}
func reloadNowPlayingInfo() {
var info = [String : Any]()
info[MPMediaItemPropertyTitle] = self.titleText
info[MPMediaItemPropertyArtwork] = MPMediaItemArtwork.init("some image")
info[MPMediaItemPropertyPlaybackDuration] = seconds
info[MPNowPlayingInfoPropertyElapsedPlaybackTime] = currentSecs
info[MPMediaItemPropertyArtist] = "Artist name"
MPNowPlayingInfoCenter.default().nowPlayingInfo = info
}
对于命令中心,
func setupCommandCenter() {
let commandCenter = MPRemoteCommandCenter.shared()
commandCenter.playCommand.isEnabled = true
commandCenter.pauseCommand.isEnabled = true
commandCenter.playCommand.addTarget(self, action: #selector(self.playCommand(_:)))
commandCenter.pauseCommand.addTarget(self, action: #selector(self.pauseCommand(_:)))
}
@objc func playCenter(_ action: MPRemoteCommandEvent) {
self.state = .play
self.playBtn.setBackgroundImage("some image"), for: .normal)
self.player.play()
self.fetchTracks()
}
@objc func pauseCenter(_ action: MPRemoteCommandEvent) {
self.state = .pause
self.playBtn.setBackgroundImage("some image"), for: .normal)
self.player.pause()
self.fetchTracks()
}
答案 0 :(得分:4)
除了您提供的代码外,您还可能在应用程序委托中的某处调用了以下代码:
UIApplication.shared.beginReceivingRemoteControlEvents()
除了使用MPRemoteCommandCenter.shared()
之外,执行此操作似乎还会导致竞争。
在iOS 7.1和更高版本中,使用共享的MPRemoteCommandCenter对象注册远程控制事件。使用共享的命令中心对象时,无需调用此方法。
此方法开始使用响应者链传递远程控制事件。
从您的应用程序委托中删除该方法,您应该可以。
答案 1 :(得分:1)
如果您在代码中添加2个观察者以接收玩家通知。您可能会在播放器锁定屏幕上看到延迟或跳动。
避免添加观察者和目标。
commandCenter.playCommand.addTarget(self, action: #selector(self.playCommand(_:)))
仅一次。并在您不想要的时候将其删除