Как убрать элементы управления плеером с экрана блокировки после завершения воспроизведения в iOS10+?

При воспроизведении звука в фоновом режиме элементы управления проигрывателем отображаются на экране блокировки. Как удалить его, когда звук остановился? Если попытаться установить:

MPNowPlayingInfoCenter.default().nowPlayingInfo = nil

плеер все еще на локскрине, но поля исполнитель/песня пусты

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

UPD (мой код для аудиосессии):

в AppDelegate:

func setupAudioSession() {

    let audioSession = AVAudioSession.sharedInstance()

    do {
        try audioSession.setCategory(AVAudioSessionCategoryPlayback)
        try audioSession.setActive(true)

    } catch {
        print("Setting category to AVAudioSessionCategoryPlayback failed.")
    }
}

в классе игрока:

private func clearRemotePlayerInfo() { // call after stop button pressed
    try? AVAudioSession.sharedInstance().setActive(false)
    MPNowPlayingInfoCenter.default().nowPlayingInfo = [:]
}

person Max    schedule 09.09.2018    source источник
comment
Вы имеете в виду под когда звук остановился, что звук закончил воспроизводиться (до конца аудиофайла)?   -  person ielyamani    schedule 15.09.2018


Ответы (1)


TL;DR

Пример на Github: https://github.com/JakubMazur/SO52243428


Вы не должны назначать nil этому nowPlayingInfo.

Что вы должны сделать, чтобы достичь этого:

  1. Остановите воспроизведение (не обязательно, но хорошо очистить то, что вы создали)
  2. Сделать сеанс неактивным
  3. Очистить nowPlayingInfo

Таким образом, код будет выглядеть так:

self.player?.stop() // Where self.player is AVAudioPlayer
try? self.session?.setActive(false, with: .notifyOthersOnDeactivation) // Where self.session is AVAudioSession. You should do it with do-catch to good error catching.
MPNowPlayingInfoCenter.default().nowPlayingInfo = [:]

И вести себя он будет так:

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

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

Я написал как можно более простой пример, чтобы попробовать. Он доступен на Github https://github.com/JakubMazur/SO52243428. Не стесняйтесь проверить это, и это соответствует вашему случаю.

person Jakub    schedule 13.09.2018
comment
большое спасибо за ответ. Но я не могу получить тот же результат. Поля очистились, но игровая зона не исчезла. Я обновлю свой вопрос сейчас - person Max; 14.09.2018
comment
Пожалуйста, смотрите обновленный ответ, я предоставил как можно более простой пример, он только в AppDelegate для этого случая, и отправной точкой для этого будет didFinishLaunchingWithOptions - person Jakub; 14.09.2018
comment
Якуб, посмотри на это: streamable.com/0g7ih (запусти свой проект на моем устройстве) - person Max; 14.09.2018
comment
Интересно! Это iOS 10 или 11? - person Jakub; 14.09.2018
comment
iOS 11 (11.2.5) - person Max; 14.09.2018
comment
Странно, я не могу воспроизвести это на iOS 11.4.1 даже на самом медленном устройстве. и, к сожалению, вы не можете проверить это на симуляторе. У меня нет доступа к 11.2.5 - person Jakub; 14.09.2018
comment
Чуть позже протестирую на другой версии iOS ) - person Max; 14.09.2018
comment
Неважно присваивать nil или [:] nowPlayingInfo — результат тот же. Сделать сеанс неактивным также необязательно. Просто не работает в iOS 11.2.5 и работает в 11.4 ) - person Max; 15.09.2018
comment
К сожалению, это не работает с AVQueuePlayer. - person Blago; 18.09.2019