iosswiftavfoundationavaudioplayermpmusicplayercontroller

How Do I Get Audio Controls on Lock Screen/Control Center from AVAudioPlayer in Swift


New to iOS development, so here goes. I have an app that is playing audio - I'm using AVAudioPlayer to load single files by name in the app's assets. I don't want to query the user's library, only the files provided. Works great, but, I want the user to be able to pause and adjust volume from the lock screen.

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

My use of AVAudioSession and MPNowPlayingInfoCenter were just experiments from reading other related posts.

Background mode is enabled for audio in my app's plist file


Solution

  • You need to invoke beginReceivingRemoteControlEvents() otherwise it will not work on the actual device.

    Swift 3.1

    UIApplication.shared.beginReceivingRemoteControlEvents()
    

    If you would like to specify custom actions for the MPRemoteCommandCenter:

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

    edit/update:

    Apple has a sample project showing how to Becoming a Now Playable App