Блокировка экрана iOS 12 для музыкального приложения - PullRequest
0 голосов
/ 22 сентября 2018

В iOS 11 мое музыкальное приложение показывало бы элементы управления экрана блокировки, когда я блокировал свой iPhone.Я смог увидеть песню, которая воспроизводится в данный момент, и воспроизведение / пауза, переход вперед и назад.Однако при обновлении до Xcode 10 / iOS 12 я больше не вижу элементов управления экрана блокировки только датой и временем ...

Однако, если я проведу пальцем вверх и получу этот экран виджета (где вы можете включить самолетрежим и т. д.) Я МОГУ видеть информацию, воспроизводимую сейчас.

Вот что у меня есть

В фоновом режиме

Modes

Я обновил свой код до следующего:

Вызывается в моем viewDidLoad

do {
  try AVAudioSession.sharedInstance().setCategory(.soloAmbient, mode: .default, options: .allowAirPlay)
print("Playback OK")
  try AVAudioSession.sharedInstance().setActive(true)
  print("Session is Active")
} catch {
  print(error)
}


UIApplication.shared.beginReceivingRemoteControlEvents()
self.becomeFirstResponder()

У меня ранее не было следующего кода в последней рабочей версии, но я добавил егопотому что я нашел похожие посты, предлагающие сделать это

if let songInfo = self.mediaPlayer.nowPlayingItem {
  nowPlayingInfoCenter.nowPlayingInfo = [
    MPMediaItemPropertyTitle: songInfo.title ?? "",
    MPMediaItemPropertyArtist: songInfo.artist ?? "",
    MPMediaItemPropertyArtwork : songInfo.artwork?.image(at: CGSize(width: 400, height: 400)) ?? #imageLiteral(resourceName: "emptyArtworkImage")]
}

Я ставлю точки останова на do try, он не печатает ни одну из функций печати и пропускает try

Преобразовал ли ямой код неверен?

1 Ответ

0 голосов
/ 29 сентября 2018

Не забудьте настроить MPRemoteCommandCenter:

import MediaPlayer

//Use an AVPlayer
var player: AVPlayer!
var playerItem: AVPlayerItem!

Вы можете настроить AVPlayer в viewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()

    let path = Bundle.main.path(forResource: "My Heart Will Go On", ofType:"mp3")!
    let url = URL(fileURLWithPath: path)
    playerItem = AVPlayerItem(url: url)
    player = AVPlayer(playerItem: playerItem)
    setupAudioSession()
}

Установить аудио сеанс так:

func setupAudioSession() {
    do {
        try AVAudioSession.sharedInstance().setCategory(.soloAmbient, mode: .default, options: .allowAirPlay)
        try AVAudioSession.sharedInstance().setActive(true)
    } catch {
        print("Error setting the AVAudioSession:", error.localizedDescription)
    }
}

Воспроизведение аудиофайла

func play() {
    player.play()
    setupNowPlaying()
    setupRemoteCommandCenter()
}

, который устанавливает MPNowPlayingInfoCenter (настройте его под свой код):

func setupNowPlaying() {
    // Define Now Playing Info
    var nowPlayingInfo = [String : Any]()
    nowPlayingInfo[MPMediaItemPropertyTitle] = "My Song"

    nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = playerItem.currentTime().seconds
    nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = playerItem.asset.duration.seconds
    nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = player.rate

    // Set the metadata
    MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
    MPNowPlayingInfoCenter.default().playbackState = .playing
}

И MPRemoteCommandCenter:

func setupRemoteCommandCenter() {
    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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...