MPRemoteCommandCenter play/pause Мигает при прикосновении
Я работаю над приложением для музыкального плеера Swift
, аудио потоки с AVPlayer
и все хорошо
но когда я попытался добавить MPRemoteCommandCenter в свое приложение, было много ошибок, которые я не знаю даже, почему это произошло
ссылка на видео, которое описывает мою проблему
AVPlayer реализован так:
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
}
и для командного центра,
MPRemoteCommandCenter Реализовано как:
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()
}
1 ответ
В дополнение к представленному вами коду вы могли бы также вызвать следующее где-то в вашем делегате приложения:
UIApplication.shared.beginReceivingRemoteControlEvents()
Делать это в дополнение к использованию MPRemoteCommandCenter.shared()
кажется, вызывает состояние гонки.
Согласно документации Apple:
В iOS 7.1 и более поздних версиях используйте общий объект MPRemoteCommandCenter для регистрации событий удаленного управления. Вам не нужно вызывать этот метод при использовании общего объекта командного центра.
Этот метод запускает доставку событий дистанционного управления, используя цепочку респондента.
Удалите этот метод из вашего делегата приложения, и все будет в порядке.
Если вы добавите 2 наблюдателя в свой код для получения уведомлений игрока. Вы можете увидеть отставание или скачок на экране блокировки игрока.
Избегайте добавления наблюдателя и однажды цель.
commandCenter.playCommand.addTarget(self, action: #selector(self.playCommand(_:)))
только однажды. и удали его, когда ты не хотел