MPRemoteCommandCenter play / pause Мигает при прикосновении - PullRequest
0 голосов
/ 31 декабря 2018

Я работаю над приложением для музыкального плеера, написанным на 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()
}

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Если вы добавите 2 наблюдателя в свой код для получения уведомлений игрока.Вы можете увидеть отставание или скачок на экране блокировки игрока.

избегайте добавления наблюдателя и один раз цели.

commandCenter.playCommand.addTarget(self, action: #selector(self.playCommand(_:)))

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

0 голосов
/ 18 января 2019

В дополнение к представленному вами коду, вы могли бы также вызвать следующее где-то в вашем делегате приложения:

UIApplication.shared.beginReceivingRemoteControlEvents()

Выполнение этого в дополнение к использованию MPRemoteCommandCenter.shared(), кажется, вызывает состояние гонки.

Согласно документации Apple :

В iOS 7.1 и более поздних версиях используйте общий объект MPRemoteCommandCenter для регистрации событий удаленного управления.Вам не нужно вызывать этот метод при использовании объекта общего командного центра.

Этот метод запускает доставку событий дистанционного управления, используя цепочку респондента.

Удалите этот метод из вашегоприложение делегат и у тебя должно быть все в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...