web-dev-qa-db-fra.com

Comment obtenir des commandes audio sur l'écran de verrouillage/le centre de contrôle auprès de AVAudioPlayer dans Swift

Nouveau dans le développement iOS, alors allez-y. J'ai une application qui lit de l'audio. J'utilise AVAudioPlayer pour charger des fichiers uniques par leur nom dans les éléments de l'application. Je ne veux pas interroger la bibliothèque de l'utilisateur, mais uniquement les fichiers fournis. Fonctionne très bien, mais je veux que l'utilisateur puisse faire une pause et régler le volume à partir de l'écran de verrouillage.

func initAudioPlayer(file:String, type:String){
    let path = NSBundle.mainBundle().pathForResource(file, ofType: type)!
    let url = NSURL(fileURLWithPath: path)
    let audioShouldPlay = audioPlaying()
    do{
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
        try AVAudioSession.sharedInstance().setActive(true)
        let audioPlayer:AVAudioPlayer = try AVAudioPlayer(contentsOfURL: url)
        audioPlayer.volume = slider.value
        audioPlayer.numberOfLoops = -1
        audioPlayer.prepareToPlay()
        if(audioShouldPlay){
            audioPlayer.play()
//                let mpic = MPNowPlayingInfoCenter.defaultCenter()
//                mpic.nowPlayingInfo = [MPMediaItemPropertyTitle:"title", MPMediaItemPropertyArtist:"artist"]
        }
    }
    catch{}
}

Mon utilisation de AVAudioSession et MPNowPlayingInfoCenter n’était que des expériences tirées de la lecture d’autres publications.

Le mode d'arrière-plan est activé pour l'audio dans le fichier Plist de mon application

15
nbpeth

Vous devez appeler beginReceivingRemoteControlEvents () sinon cela ne fonctionnera pas sur le périphérique réel.

Swift 3.1

UIApplication.shared.beginReceivingRemoteControlEvents()

Si vous souhaitez spécifier des actions personnalisées pour MPRemoteCommandCenter:

let commandCenter = MPRemoteCommandCenter.shared()
commandCenter.nextTrackCommand.isEnabled = true
commandCenter.nextTrackCommand.addTarget(self, action:#selector(nextTrackCommandSelector))
24
Leo Dabus
func myplayer(file:String, type:String){
let path = NSBundle.mainBundle().pathForResource(file, ofType: type)!
let url = NSURL(fileURLWithPath: path)
let audioShouldPlay = audioPlaying()
do{
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
    try AVAudioSession.sharedInstance().setActive(true)
    let audioPlayer:AVAudioPlayer = try AVAudioPlayer(contentsOfURL: url)
    audioPlayer.volume = slider.value
    audioPlayer.numberOfLoops = -1
    audioPlayer.prepareToPlay()
    if(audioShouldPlay){
        audioPlayer.play()
//                let mpic = MPNowPlayingInfoCenter.defaultCenter()
//                mpic.nowPlayingInfo = [MPMediaItemPropertyTitle:"title", 
MPMediaItemPropertyArtist:"artist"]
        }
    }
    catch{}
}
3
user6812502

Il y a déjà des commandes audio sur l'écran de verrouillage (l'interface "télécommande"). Si vous souhaitez qu'ils contrôlent le son de votre application, vous devez définir votre application comme cible de contrôle à distance, comme indiqué dans Documentation d'Apple .

3
matt

J'ai ce problème. Vous avez seulement besoin 

audioSession.setCategory(.playback, mode: .default) or 
audioSession.setCategory(.playback, mode: .default, options: 
                                               .init(rawValue: 0))