RemoveTarget MPRemoteCommandCenter не работает только в первый раз

Я показываю MPRemoteCommandCenter двумя viewController.

  1. MediaViewController
  2. DownloadViewController

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

extension MediaViewController {

// Call in viewDidload
func setupNowPlayingInfoCenter() {
    try! AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
    try! AVAudioSession.sharedInstance().setActive(true)
    deinitNowPlayInfoCenter()
    MPRemoteCommandCenter.shared().playCommand.addTarget(self, action: #selector(self.playPressed))
    MPRemoteCommandCenter.shared().pauseCommand.addTarget(self, action: #selector(self.pausePressed))
    MPRemoteCommandCenter.shared().nextTrackCommand.addTarget(self, action: #selector(self.nextPressed))
    MPRemoteCommandCenter.shared().previousTrackCommand.addTarget(self, action: #selector(self.previousPressed))
    MPRemoteCommandCenter.shared().skipForwardCommand.isEnabled = false
    MPRemoteCommandCenter.shared().skipBackwardCommand.isEnabled = false
}

//Call this method when move to DownloadViewController.
func deinitNowPlayInfoCenter() {
    MPRemoteCommandCenter.shared().playCommand.removeTarget(self)
    MPRemoteCommandCenter.shared().pauseCommand.removeTarget(self)
    MPRemoteCommandCenter.shared().nextTrackCommand.removeTarget(self)
    MPRemoteCommandCenter.shared().previousTrackCommand.removeTarget(self)
}

private func updateNowPlayingInfoCenter(reset: Bool = false) {

    if reset {
        MPNowPlayingInfoCenter.default().nowPlayingInfo = [:]
        return
    }

    let mediaModal: MediaModel
    if arrMedia.count > currentIndex, let player = self.playerViewController?.player {
        mediaModal = arrMedia[currentIndex]
        let nowPlayingInfo = [MPMediaItemPropertyTitle: mediaModal.media_title ?? "",
                              MPMediaItemPropertyAlbumTitle: mediaModal.event_type.name,
                              MPMediaItemPropertyArtist: mediaModal.mediaType ?? "",
                              MPNowPlayingInfoPropertyElapsedPlaybackTime: CMTimeGetSeconds(player.currentTime())
                              ] as [String : Any]

        MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
    }
}
}

То же самое делает в DownloadViewController

extension DownloadViewController {

//call in viewdidload.
func setupNowPlayingInfoCenter() {
    try! AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
    try! AVAudioSession.sharedInstance().setActive(true)
    UIApplication.shared.endReceivingRemoteControlEvents()
    UIApplication.shared.beginReceivingRemoteControlEvents()

    self.deinitNowPlayInfoCenter()
    MPRemoteCommandCenter.shared().playCommand.addTarget(self, action: #selector(playPressed))
    MPRemoteCommandCenter.shared().pauseCommand.addTarget(self, action: #selector(pausePressed))
    MPRemoteCommandCenter.shared().nextTrackCommand.addTarget(self, action: #selector(nextPressed))
    MPRemoteCommandCenter.shared().previousTrackCommand.addTarget(self, action: #selector(previousPressed)) 
    MPRemoteCommandCenter.shared().skipForwardCommand.isEnabled = false
    MPRemoteCommandCenter.shared().skipBackwardCommand.isEnabled = false
}

//call in viewWillDisappear
func deinitNowPlayInfoCenter() { 
    MPRemoteCommandCenter.shared().playCommand.removeTarget(self)
    MPRemoteCommandCenter.shared().pauseCommand.removeTarget(self)
    MPRemoteCommandCenter.shared().nextTrackCommand.removeTarget(self)
    MPRemoteCommandCenter.shared().previousTrackCommand.removeTarget(self)
}

private func updateNowPlayingInfoCenter(reset: Bool = false) {

    if reset {
        MPNowPlayingInfoCenter.default().nowPlayingInfo = [:]
        return
    }

    let mediaModal: MediaModel
    if arrMedia.count > currentIndex, let player = self.playerViewController?.player {
        mediaModal = arrMedia[currentIndex]
        let nowPlayingInfo = [MPMediaItemPropertyTitle: mediaModal.media_title ?? "",
                              MPMediaItemPropertyAlbumTitle: mediaModal.event_type.name,
                              MPMediaItemPropertyArtist: mediaModal.mediaType ?? "",
                              MPNowPlayingInfoPropertyElapsedPlaybackTime: CMTimeGetSeconds(player.currentTime())
                              ] as [String : Any]

        MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
    }
}
}

Я обрабатываю действия в уважаемом контроллере представления (которым MPRemoteCommandCenter открыть).

Все работает нормально, кроме одного теста

При первом входе пользователя в систему и переходе непосредственно к моему MediaViewController (выберите Media TabItem в TabBarViewController) и откройте downloadViewController (из BarButtonItem в панели навигации MediaViewController) и воспроизведите песню (AvPlayerViewController), а затем нажмите кнопку паузы в MPRemoteCommandCenter, Вызывается цель MediaViewController вместо цели DownloadViewController. Я бываю только в этом тесте. Помимо этого случая это работает нормально. Если пользователь выходит из системы и снова входит в систему, он генерирует снова.

Еще одна вещь, если пользователь войдет в систему и затем подождет некоторое время (30 секунд) или сделает что-то еще, затем сделает то же самое, тогда он будет работать нормально, но если пользователь непосредственно переходит к mediaviewcontroller, не обращая внимания ни на секунду, то это происходит.

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

 MPRemoteCommandCenter.shared().pauseCommand.removeTarget(self)

не работает, когда приложение загружается в начале.

0 ответов

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