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?

ACTUALIZAR

Sin 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.

Respuestas a la pregunta(1)

Su respuesta a la pregunta