Информация о музыке отображается в Центре управления, но не на экране блокировки

Использование Swift 4+, iOS 11+, Xcode 10+

Я создал музыкальный проигрыватель с помощью MPMediaPlayer и могу взаимодействовать с ним из Центра управления, однако я хотел бы также видеть его на экране блокировки.

Честно говоря, я немного смущен тем, почему он отображается/работает в Центре управления, поскольку я не написал для этого никакого кода. Тем не менее, я также хотел бы, чтобы он отображался на экране блокировки.

Вот что я сделал до сих пор:

1) Я использую приложение MusicPlayer и убедился, что во время моих тестов что-то играет:

MPMusicPlayerController.applicationMusicPlayer

2) Установите BackgroundModes, чтобы включить Audio, Fetch и Remote Notifications.

введите здесь описание изображения

3) Добавлен код AVAudioSession (который, похоже, ничего не делает, поскольку я пробовал его и пытался комментировать и не видел разницы):

  let session = AVAudioSession.sharedInstance()
    do {
        // Configure the audio session for playback
        try session.setCategory(AVAudioSessionCategoryPlayback,
                                mode: AVAudioSessionModeDefault,
                                options: [])
        try session.setActive(true)
    } catch let error as NSError {
        print("Failed to set the audio session category and mode: \(error.localizedDescription)")
    }

4) Использовал этот базовый код, чтобы посмотреть, смогу ли я отобразить его на экране блокировки только с некоторым базовым жестко запрограммированным содержимым:

let nowPlayingInfo: [String: Any] = [
    MPMediaItemPropertyArtist: "Pink Floyd",
    MPMediaItemPropertyTitle: "Wish You Were Here",
    //MPMediaItemPropertyArtwork: mediaArtwork,
]
MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo

UIApplication.shared.beginReceivingRemoteControlEvents()
let commandCenter = MPRemoteCommandCenter.shared()

5) Я знаю, что не реализовал ничего, чтобы активно обновлять информацию или отвечать на какие-либо команды, поскольку я просто пытаюсь показать что-то на экране блокировки на данный момент.

Почему информация о текущем воспроизведении отображается в Центре управления, если я ничего не сделал, чтобы поместить ее туда?

Что мне нужно сделать, чтобы информация отображалась на экране блокировки, как в Центре управления?

РЕДАКТИРОВАТЬ: Ссылка на простой проект с такой же проблемой в GitLab: https://gitlab.com/whoit/lockscreentest

РЕДАКТИРОВАТЬ: я отправил это как ошибку в Apple, однако они еще не подтвердили или не решили это.


comment
Вы пробовали MPNowPlayingInfoCenter.default().setValuesForKeys(nowPlayingInfo) вместо MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo ?   -  person Arash Etemad    schedule 17.02.2019
comment
@ArashEtemad Я попробовал ваше предложение, но оно выдает эту ошибку: Завершение приложения из-за необработанного исключения «NSUnknownKeyException», причина: «[‹MPNowPlayingInfoCenter 0x111e4bad0› setValue: forUndefinedKey:]: этот класс не соответствует кодированию значения ключа для заголовка ключа. ' Вы пробовали это сами? Возможно, вам стоит попробовать мой пример проекта?   -  person wayneh    schedule 17.02.2019
comment
вы правы, это выдает исключение. Вы вынуждены использовать .applicationMusicPlayer? вы можете показать информацию о песне, используя .systemMusicPlayer, но я думаю, что он обрабатывает информацию автоматически.   -  person Arash Etemad    schedule 18.02.2019


Ответы (2)


Мне пришлось заполнить (даже с пустой строкой) как минимум 4 ключа, чтобы увидеть что-то правильное на экране блокировки:

  • MPMediaItemPropertyTitle
  • MPMediaItemPropertyArtist
  • MPMediaItemPropertyAlbumTitle
  • MPNowPlayingInfoPropertyPlaybackRate

вы можете проверить этот исходный код NowPlayingSource:

person raphael    schedule 13.01.2019
comment
Я добавил значения для этих свойств, но они все равно не отображаются. Я заметил в вашем исходном коде, что вы также используете эту функцию переопределения overrideInfoCenter (для ключа: строка, значение: любое) Это обязательно? - person wayneh; 13.01.2019
comment
нет overrideInfoCenter не требуется. Я не знаю, может ли это вам помочь, но добавили ли вы в свой info.plist ключ UIBackgroundModes со звуком в качестве значения? - person raphael; 14.01.2019
comment
Разве это не то же самое, что шаг 2 в моем исходном посте? - person wayneh; 14.01.2019
comment
да ты прав извините. так что больше никаких зацепок. - person raphael; 14.01.2019
comment
Спасибо за попытку! - person wayneh; 14.01.2019
comment
Я думаю, я создам пример проекта и посмотрю, смогу ли я понять это. - person wayneh; 14.01.2019

Использование .systemMusicPlayer вместо .applicationMusicPlayer решит вашу проблему.

Как яблочный документ:

Музыкальный проигрыватель не влияет на состояние приложения «Музыка». Когда ваше приложение переходит в фоновый режим, музыкальный проигрыватель перестает воспроизводить текущий медиафайл.

И я думаю, что это связано с тем, что он не отображается на заблокированном экране.

а также systemMusicPlayer обрабатывает всю информацию о песнях для автоматического отображения.

person Arash Etemad    schedule 18.02.2019
comment
Я использую приложение MusicPlayer, чтобы оно могло играть в фоне, а также чтобы оно не было жестко привязано к системному проигрывателю. Если я перейду с приложения на систему, я потеряю некоторые важные функции и получу некоторые неприятные проблемы. - person wayneh; 21.02.2019