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