MPNowPlayingInfoCenter не обновляет информацию, когда после назначения nowPlayingInfo

Я делаю приложение для iOS с использованием Swift 3, в котором было бы неплохо отобразить информацию о воспроизводимом в данный момент элементе на экране блокировки и в центре управления.

В настоящее время я использую следующий код, чтобы попытаться вставить эту информацию в nowPlayingInfo толковый словарь. Я также включил ссылку на VideoInfo класс, который используется в videoBeganPlaying(_:),

class VideoInfo {
    var channelName: String
    var title: String
}

// ...

var videoInfoNowPlaying: VideoInfo?

// ...

@objc private func videoBeganPlaying(_ notification: NSNotification?) {
    // apparently these have to be here in order for this to work... but it doesn't
    UIApplication.shared.beginReceivingRemoteControlEvents()
    self.becomeFirstResponder()
    guard let info = self.videoInfoNowPlaying else { return }
    let artwork = MPMediaItemArtwork(boundsSize: .zero, requestHandler:
        { (_) -> UIImage in #imageLiteral(resourceName: "DefaultThumbnail") }) // this is filler
    MPNowPlayingInfoCenter.default().nowPlayingInfo = [
            MPMediaItemPropertyTitle: info.title,
            MPMediaItemPropertyArtist: info.channelName,
            MPMediaItemPropertyArtwork: artwork
        ]
    print("Current title: ", MPNowPlayingInfoCenter.default().nowPlayingInfo?[MPMediaItemPropertyTitle])
}

Функция вызывается, когда она должна быть, и оператор print выполняется, выводя Optional("title"), Однако центр управления и экран блокировки не обновляют свою информацию. Пауза / воспроизведение, и кнопка пропуска вперед работает, как я установил их в viewDidLoad() с помощью MPRemoteCommandCenter,

Что не так?

РЕДАКТИРОВАТЬ:

Как указал Мэтт, AVPlayerViewController делает MPNowPlayingInfoCenter фанк. Это была моя проблема. Я должен был указать, что это класс, который я использую, а не просто AVPlayer,

Смотрите: https://developer.apple.com/reference/avkit/avplayerviewcontroller/1845194-updatesnowplayinginfocenter

4 ответа

Решение

Это работает, и вам не нужно все это о первом респонденте и так далее, так как вы можете легко доказать это, просто перейдя вперед и установив информацию о воспроизводимой в данный момент информации и ничего больше:

Так почему же это не работает для вас? Возможно, потому что вы используете какой-то плеер (например, AVPlayerViewController), который каким-то образом устанавливает саму воспроизводимую информацию и таким образом переопределяет ваши настройки.

Если вы используете AVPlayerViewControllerВы можете указать, что AVPlayerViewController Экземпляр не обновляет NowPlayingInfoCenter:

playerViewController.updatesNowPlayingInfoCenter = false

2021, и я все еще испытывал эту проблему при использовании. Я работаю над приложением, которое воспроизводит как подкасты, так и видео. Информационный центр "Воспроизведение" корректно работает с подкастами, но не показывает никакой информации о видео, которые воспроизводятся с использованием AVPlayerViewController хотя я устанавливаю MPNowPlayingInfoCenter.nowPlayingInfo правильно.

Нашел решение, просматривая « Сейчас играет» и удаленные команды на tvOS, хотя я не работаю с tvOS.

По сути, вместо заполнения информации с помощью MPNowPlayingInfoCenter Я установил externalMetadata на AVPlayerItem и это работает.

      let playerItem = AVPlayerItem(url: data.url)
let title = AVMutableMetadataItem()
title.identifier = .commonIdentifierTitle
title.value = "Title" as NSString
title.extendedLanguageTag = "und"

let artist = AVMutableMetadataItem()
artist.identifier = .commonIdentifierArtist
artist.value = "Artist" as NSString
artist.extendedLanguageTag = "und"

let artwork = AVMutableMetadataItem()
artwork.identifier = .commonIdentifierArtwork
artwork.value = imageData as NSData
artwork.dataType = kCMMetadataBaseDataType_JPEG as String
artwork.extendedLanguageTag = "und"

playerItem.externalMetadata = [title, artist, artwork]

Этот код обновляет информацию о воспроизведении корректно.

Это меня зацепило. Нашел полезный пост по этому поводу. https://nowplayingapps.com/how-to-give-more-control-to-your-users-using-mpnowplayinginfocenter/

«Для отображения nowplayinginfo на экране уведомлений вам необходимо добавить этот последний фрагмент кода в функцию didFinishLaunchingWithOptions вашего AppDelegate».

      func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
     application.beginReceivingRemoteControlEvents()
}
Другие вопросы по тегам