RemoveTarget MPRemoteCommandCenter не работает только в первый раз
Я показываю MPRemoteCommandCenter
двумя viewController.
- MediaViewController
- 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)
не работает, когда приложение загружается в начале.