15

Nuovo per lo sviluppo iOS, ecco qui. Ho un'app che sta riproducendo audio - Sto usando AVAudioPlayer per caricare singoli file per nome nelle risorse dell'app. Non voglio interrogare la libreria dell'utente, solo i file forniti. Funziona alla grande, ma, voglio che l'utente sia in grado di mettere in pausa e regolare il volume dalla schermata di blocco.Come ottengo i controlli audio su Lock Screen/Control Center da AVAudioPlayer in Swift

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

Il mio uso di AVAudioSession e MPNowPlayingInfoCenter erano solo esperimenti dalla lettura di altri articoli correlati.

modalità Background è abilitato per l'audio in un file plist di mia app

+0

Qual è la domanda/problema? – matt

+0

La domanda è come ottengo i controlli audio sulla schermata di blocco. Ho visto che MPNowPlayingInfoCenter nowPlayingInfo è come si passano i meta dati della canzone alla schermata di blocco/centro di controllo, ma mi manca su come legarlo con AVAudioPlayer – nbpeth

+0

Ci sono già controlli audio sulla schermata di blocco. – matt

risposta

24

È necessario richiamare beginReceivingRemoteControlEvents() altrimenti non funzionerà sul dispositivo effettivo.

Swift 3,1

UIApplication.shared.beginReceivingRemoteControlEvents() 

Se si desidera specificare le azioni personalizzate per il MPRemoteCommandCenter:

let commandCenter = MPRemoteCommandCenter.shared() 
commandCenter.nextTrackCommand.isEnabled = true 
commandCenter.nextTrackCommand.addTarget(self, action:#selector(nextTrackCommandSelector)) 
+3

risposta definitiva, 'UIApplication.sharedApplication(). BeginReceivingRemoteControlEvents()' e 'AVAudioSession.sharedInstance(). SetCategory (AVAudioSessionCategoryPlayback)' – nbpeth

+0

http://stackoverflow.com/a/30280699/2303865 –

+1

dove esattamente queste linee dovrebbero essere posizionate? Non riesco a visualizzare alcun controllo della schermata di blocco per la mia app, sebbene la riproduzione audio funzioni correttamente – MikeG

3

Ci sono già comandi audio sulla schermata di blocco (l'interfaccia di "comando a distanza"). Se desideri che controllino l'audio della tua app, devi rendere la tua app il target di controllo remoto, come descritto in Apple's documentation.

+0

Spiego un modo per farlo nel mio libro; codice di esempio qui: https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch14p643ducking/ch27p912ducking/ViewController.swift O è possibile utilizzare MPRemoteCommandCenter. – matt

+0

haha, va bene. In realtà stavo guardando questo prima. Esplorerò il controllo remoto di esso. Qualche idea sul perché la modalità in background potrebbe funzionare in simulatore ma non su un vero iphone Il simulatore – nbpeth

+0

non è affidabile per quanto riguarda le modalità di background: non usarlo per nessun tipo di sperimentazione a tale riguardo. Questo è un bug noto e riconosciuto. – matt

3
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{} 
} 
Problemi correlati