AustinT AustinT - 2 months ago 25
Swift Question

Swift: Detect Volume Button Press

Volume Button Notification Function is not being called.

Code:

func listenVolumeButton(){
// Option #1
NSNotificationCenter.defaultCenter().addObserver(self, selector: "volumeChanged:", name: "AVSystemController_SystemVolumeDidChangeNotification", object: nil)
// Option #2
var audioSession = AVAudioSession()
audioSession.setActive(true, error: nil)
audioSession.addObserver(self, forKeyPath: "volumeChanged", options: NSKeyValueObservingOptions.New, context: nil)
}

override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
if keyPath == "volumeChanged"{
print("got in here")
}
}

func volumeChanged(notification: NSNotification){
print("got in here")
}


listenVolumeButton()
is being called in viewWillAppear

The code is not getting to the print statement
"got in here"
, in either case.

I am trying two different ways to do it, neither way is working.

edit: I have followed this stackoverflow thread Detect iPhone Volume Button Up Press?

Answer

Using the second method, the value of the key path should be "outputVolume". That is the property we are observing. So change the code to,

func listenVolumeButton(){

    let audioSession = AVAudioSession.sharedInstance()
    audioSession.setActive(true, error: nil)
    audioSession.addObserver(self, forKeyPath: "outputVolume",
        options: NSKeyValueObservingOptions.New, context: nil)
}

override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject,
    change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
    if keyPath == "outputVolume"{
        print("got in here")
    }
}