web-dev-qa-db-fra.com

Contrôles d'écran de verrouillage iOS 12 pour l'application musicale

Dans iOS 11, mon application musicale afficherait les commandes de l'écran de verrouillage lorsque je verrouillais mon iPhone. J'ai pu voir la chanson en cours de lecture et la lecture/pause avancer et reculer. Cependant, lors de la mise à niveau vers Xcode 10/iOS 12, je ne vois plus l'écran de verrouillage contrôler uniquement la date et l'heure ...

Cependant, si je glisse vers le haut et que j'obtiens cet écran de widget (où vous pouvez activer le mode avion, etc.), JE PEUX voir les informations en cours de lecture.

Voici ce que j'ai

Dans les modes d'arrière-plan

Modes

J'ai mis à jour mon code comme suit:

Appelé dans mon 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()

Je n'avais pas auparavant le code suivant dans la dernière version de travail mais je l'ai ajouté parce que j'ai trouvé des articles similaires suggérant de le faire

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")]
}

Je mets des points d'arrêt sur le do try il n'imprime aucune des fonctions d'impression et ignore try

Ai-je mal converti mon code?

10
RubberDucky4444

N'oubliez pas de configurer le MPRemoteCommandCenter:

import MediaPlayer

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

Vous pouvez configurer AVPlayer dans 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()
}

Réglez la session audio comme suit:

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)
    }
}

Lire le fichier audio

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

Ce qui met en place le MPNowPlayingInfoCenter (personnaliser cela à votre code):

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
}

Et le 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
    }
}
7
ielyamani