@JEL Я обновил свой ответ. Пожалуйста, дайте мне знать, если это поможет вам. Если нет, мы можем поговорить, и я могу помочь вам пройти через это.

я есть видеоплеер, который можно воспроизводить из командного центра iOS и экрана блокировки. Когда я переключаю кнопку воспроизведения / паузы в моем приложении, она должна обновить кнопку воспроизведения / паузы в командном центре (MPRemoteCommandCenter) путем обновленияnowPlayingInfo (MPNowPlayingInfoCenter). Я не уверен, почему он не обновляется.

Например, если я приостанавливаю видео с помощью пользовательской кнопки в моем приложении, в командном центре все еще отображается кнопка паузы (что означает, что видео все еще воспроизводится, что неправильно).

Вот так я обновляюnowPlayingInfo:

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
    }
}

С КВО, когда игрокrate изменения, я называю эту функцию:

// 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()
    }
}

Какие-нибудь мысли?

ОБНОВИТЬ

Я нашел решение, но не идеально в моем случае. Так что в моем приложении у меня есть 2 вида контроллера. Давайте назовем ихFeedVC а такжеPlayerVC, ТакFeedVC имеетAVPlayerЭто всегда играют, но приглушены. Если вы нажмете на одну из них, тоPlayerVC создается и воспроизводит полное видео.Если я остановлюсьAVPlayerвFeedVC перед тем какPlayerVC тогда кнопка «воспроизведение / пауза» в NowPlayingInfoCenter работает отлично!

Есть ли способ сделать эту работу, не останавливая видео вFeedVC?

Другая проблема заключается в том, чтоelapsed time продолжает считать, если я не остановлю игроков вFeedVC, Кажется, что если несколько игроков играют, кнопка воспроизведения / паузы и истекшее время неверны.

Ответы на вопрос(1)

Ваш ответ на вопрос