Get device token for remote push notifications in Swift 3

When registering device to receive remote notifications, we can use device token to uniquely identify each device and even send the token to our server.

Consider the following code

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

    let tokenParts = deviceToken.map { data -> String in
        return String(format: "%02.2hhx", data)
    }

    let token = tokenParts.joined()

    // process token

}

Here is gist for the example

Source: RayWenderlich

Handle Remote Control Commands

Handle playback controls for background audio mode

iOS Applications that play audio in background mode, can be controlled from remote control commands inside command center or the lock screen of device.

We will need to import MediaPlayer initially.

import MediaPlayer

And also player in our UIViewController subclass

var player: AVPlayer?

We will need setup function which can enable/disable remote commands

func setupRemoteCommandCenter(enable: Bool) {

    let remoteCommandCenter = MPRemoteCommandCenter.shared()

    if enable {

        remoteCommandCenter.pauseCommand.addTarget(self, action: #selector(remoteCommandCenterPauseCommandHandler))
        remoteCommandCenter.playCommand.addTarget(self, action: #selector(remoteCommandCenterPlayCommandHandler))
        remoteCommandCenter.stopCommand.addTarget(self, action: #selector(remoteCommandCenterStopCommandHandler))
        remoteCommandCenter.togglePlayPauseCommand.addTarget(self, action: #selector(remoteCommandCenterPlayPauseCommandHandler))

    } else {

        remoteCommandCenter.pauseCommand.removeTarget(self, action: #selector(remoteCommandCenterPauseCommandHandler))
        remoteCommandCenter.playCommand.removeTarget(self, action: #selector(remoteCommandCenterPlayCommandHandler))
        remoteCommandCenter.stopCommand.removeTarget(self, action: #selector(remoteCommandCenterStopCommandHandler))
        remoteCommandCenter.togglePlayPauseCommand.removeTarget(self, action: #selector(remoteCommandCenterPlayPauseCommandHandler))

    }

    remoteCommandCenter.pauseCommand.isEnabled = enable
    remoteCommandCenter.playCommand.isEnabled = enable
    remoteCommandCenter.stopCommand.isEnabled = enable
    remoteCommandCenter.togglePlayPauseCommand.isEnabled = enable

}

This function will be called with true to enable

setupRemoteCommandCenter(enable: true)

And should be called with false in deinit to stop handling remote commands

deinit {        
    setupRemoteCommandCenter(enable: false)
}

And the actual function selectors to handle remote commands

func remoteCommandCenterPauseCommandHandler() {

    // handle pause
    player?.pause()

}

func remoteCommandCenterPlayCommandHandler() {

    // handle play
    player?.play()

}

func remoteCommandCenterStopCommandHandler() {

    // handle stop
    player?.pause()

}

func remoteCommandCenterPlayPauseCommandHandler() {

    // handle play pause
    if player?.rate == 0.0 {
        player?.play()
    } else {
        player?.pause()
    }

}

We will need setup player function

func setupPlayer() {

    let streamURL = URL(string: "https://audio.stream.m3u8")!
    self.player = AVPlayer(url: streamURL)
    self.player?.play()

}

And in our example, we have a button selector function to call necessary code

@IBAction func playButtonHandler(btn: UIButton) {

    setupRemoteCommandCenter(enable: true)

    setupPlayer()

}

Here is gist for the example