I have an app that plays audio on the background using AVPlayer. I use MPNowPlayingInfoCenter to display the song's metadata on the Lock Screen and Control Center. Everything works fine except for one thing.
The remote controls on the Lock Screen and Control Center are those of a podcast app. They don't have forward and previous buttons.
I have a screenshot of how the controls are:
As you can see, I don't have forward and previous buttons.
override func viewDidLoad() {
super.viewDidLoad()
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
} catch {
print(error)
}
}
@IBAction func play(sender: AnyObject) {
if isURLAvailable == false {
return
}
if (player!.rate != 0 && player!.error == nil) {
player!.pause()
} else {
player!.play()
}
updateImage()
}
func playSong(song: Song) {
let documentsDirectoryURL = NSFileManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first as NSURL?
let url: NSURL? = documentsDirectoryURL?.URLByAppendingPathComponent(song.fileName)
let avItem = AVPlayerItem(URL: url!)
player = AVPlayer(playerItem: avItem)
player?.play()
let artworkProperty = MPMediaItemArtwork(image: song.artwork)
MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo = [MPMediaItemPropertyTitle : lblSongName.text!, MPMediaItemPropertyArtist : song.artist, MPMediaItemPropertyArtwork : artworkProperty, MPNowPlayingInfoPropertyDefaultPlaybackRate : NSNumber(int: 1), MPMediaItemPropertyPlaybackDuration : CMTimeGetSeconds((player!.currentItem?.asset.duration)!)]
}
override func remoteControlReceivedWithEvent(event: UIEvent?) {
print(event!.type)
if event!.type == UIEventType.RemoteControl {
if event?.subtype == UIEventSubtype.RemoteControlPlay || event?.subtype == UIEventSubtype.RemoteControlPause {
play(self)
}
if event?.subtype == UIEventSubtype.RemoteControlNextTrack {
next(self)
}
if event?.subtype == UIEventSubtype.RemoteControlPreviousTrack {
previous(self)
}
}
}
Rather than using the UIEvent
stream with remoteControlReceivedWithEvent
, I would recommend you use MPRemoteCommandCenter
to control the previous/next/play/pause actions on the lock screen and control center.
import MediaPlayer
// ...
let commandCenter = MPRemoteCommandCenter.sharedCommandCenter()
commandCenter.previousTrackCommand.enabled = true;
commandCenter.previousTrackCommand.addTarget(self, action: "previousTrack")
commandCenter.nextTrackCommand.enabled = true
commandCenter.nextTrackCommand.addTarget(self, action: "nextTrack")
commandCenter.playCommand.enabled = true
commandCenter.playCommand.addTarget(self, action: "playAudio")
commandCenter.pauseCommand.enabled = true
commandCenter.pauseCommand.addTarget(self, action: "pauseAudio")
Where previousTrack
, nextTrack
, playAudio
, and pauseAudio
are all functions in your class where you control the player.
You may need to explicitly disable the skip forward and backward commands as well:
commandCenter.skipBackwardCommand.enabled = false
commandCenter.skipForwardCommand.enabled = false
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With