Reproducir / Pausa y Tiempo transcurrido no se actualiza correctamente en el centro de comandos de iOS
Tengo un reproductor de video que puede reproducir desde el centro de comandos de iOS y la pantalla de bloqueo. Cuando cambio un botón de reproducción / pausa en mi aplicación, debería actualizar el botón de reproducción / pausa en el centro de comando (MPRemoteCommandCenter
) actualizando elnowPlayingInfo
(MPNowPlayingInfoCenter
) No estoy seguro de por qué no se está actualizando.
Por ejemplo, si detengo el video con un botón personalizado en mi aplicación, el centro de comando aún muestra el botón de pausa (lo que significa que el video aún se está reproduciendo, lo cual es incorrecto).
Así es como actualizo elnowPlayingInfo
:
func updateMPNowPlayingInforCenterMetadata() {
guard video != nil else {
nowPlayingInfoCenter.nowPlayingInfo = nil
return
}
var nowPlayingInfo = nowPlayingInfoCenter.nowPlayingInfo ?? [String: Any]()
let image: UIImage
if let placeholderLocalURL = video.placeholderLocalURL, let placeholderImage = UIImage(contentsOfFile: placeholderLocalURL.path) {
image = placeholderImage
} else {
image = UIImage()
}
let artwork = MPMediaItemArtwork(boundsSize: image.size, requestHandler: { _ -> UIImage in
return image
})
nowPlayingInfo[MPMediaItemPropertyTitle] = video.title
nowPlayingInfo[MPMediaItemPropertyAlbumTitle] = video.creator?.name ?? " "
nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork
nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = Float(video.duration)
nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = Float(currentTime) // CMTimeGetSeconds(player.currentItem!.currentTime())
nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = player.rate
nowPlayingInfo[MPNowPlayingInfoPropertyDefaultPlaybackRate] = player.rate
nowPlayingInfoCenter.nowPlayingInfo = nowPlayingInfo
if player.rate == 0.0 {
state = .paused
} else {
state = .playing
}
}
Con KVO, cuando el jugadorrate
cambios, llamo a esta función:
// MARK: - Key-Value Observing Method
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
guard context == &assetPlaybackManagerKVOContext else {
super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
return
}
} else if keyPath == #keyPath(AVPlayer.rate) {
updateMPNowPlayingInforCenterMetadata()
}
}
¿Alguna idea?
ACTUALIZARSin embargo, encontré una solución pero no perfecta en mi caso. Entonces, en mi aplicación tengo 2 controles de vista. Vamos a llamarlosFeedVC
yPlayerVC
. EntoncesFeedVC
tieneAVPlayer
's que siempre están jugando pero están silenciados. Si hace clic en uno de ellos, entonces elPlayerVC
se crea y reproduce el video completo.Si detengo elAVPlayer
'pecadoFeedVC
antes de ir aPlayerVC
¡entonces el botón "reproducir / pausar" en NowPlayingInfoCenter funciona perfectamente!
¿Hay alguna manera de hacer que esto funcione sin tener que pausar los videos en elFeedVC
?
Otro problema es que elelapsed time
sigue contando si no detengo a los jugadores en elFeedVC
. Parece que si varios jugadores están jugando, el botón de reproducción / pausa y el tiempo transcurrido son incorrectos.