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(_:)))

только однажды. и удали его, когда ты не хотел

Другие вопросы по тегам