Как обновить MPNowPlayingInfoCenter при использовании MPMusicPlayerApplicationController

Я пытаюсь обновить MPNowPlayingInfoCenter с информацией о песне трека, который я играю из Apple Music. Я сделал следующее:

Установите мой фоновый режим на: «Аудио, Airplay и картинка в картинке»,

Правильно установите мою AVAudioSession категорию:

let session = AVAudioSession.sharedInstance()

do {
    try session.setCategory(AVAudioSessionCategoryPlayback, with: [])
    try session.setActive(true)
} catch let error as NSError {
    print("Failed to set the audio session category and mode: \(error.localizedDescription)")
}

Настройте MPRemoteCommandCenter для ответа на удаленные команды:

let commandCenter = MPRemoteCommandCenter.shared();
commandCenter.playCommand.isEnabled = true
commandCenter.playCommand.addTarget {event in
    self.player.play()
    return .success
}
commandCenter.pauseCommand.isEnabled = true
commandCenter.pauseCommand.addTarget {event in
    self.player.pause()
    return .success
}
commandCenter.nextTrackCommand.isEnabled = true
commandCenter.nextTrackCommand.addTarget {event in
    self.goForward()
    return .success
}
commandCenter.previousTrackCommand.isEnabled = true
commandCenter.previousTrackCommand.addTarget {event in
    self.goBack()
    return .success
}

И обновление MPNowPlayingInfoCenter правильной информацией при запуске и всякий раз, когда есть события воспроизведения:

let info: [String:Any] = [
    MPMediaItemPropertyAlbumTitle : albumTitle,
    MPNowPlayingInfoCollectionIdentifier : albumId,
    MPMediaItemPropertyArtist : artistName,
    MPNowPlayingInfoPropertyMediaType : mediaType,
    MPMediaItemPropertyPersistentID : trackId,
    MPMediaItemPropertyTitle : trackTitle,
    MPMediaItemPropertyPlaybackDuration : trackDuration,
    MPNowPlayingInfoPropertyExternalContentIdentifier : trackId,
    MPNowPlayingInfoPropertyPlaybackRate : isPlaying ? 1.0 : 0.0,
    MPNowPlayingInfoPropertyPlaybackProgress : 0.5,
    MPMediaItemPropertyArtwork : MPMediaItemArtwork(boundsSize: CGSize(width: 100, height: 100), requestHandler: { (size: CGSize) -> UIImage in
        return UIImage(named: "play")! // dummy purposes
    })
]

let infoCenter = MPNowPlayingInfoCenter.default()
infoCenter.nowPlayingInfo = info
infoCenter.playbackState = isPlaying ? .playing : .paused

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


person Wayne Hartman    schedule 25.03.2018    source источник


Ответы (1)


Оказывается, код на 100% правильный, но это ошибка в iOS 11, предшествующей 11.3. С официальным выпуском 11.3 на этой неделе приведенный выше код теперь работает так, как Apple планировала с MPMusicPlayerApplicationController.

person Wayne Hartman    schedule 01.04.2018