检测音量button按下

没有调用音量button通知function。

码:

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()在viewWillAppear中被调用

在这两种情况下,代码都没有得到"got in here"的打印语句。

我正在尝试两种不同的方式来做到这一点。

我跟着这个: 检测iPhone音量button上按?

使用第二种方法,键path的值应该是"outputVolume" 。 这是我们正在观察的财产。 所以改变代码,

 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") } } 

上面的代码在Swift 3中不起作用,在这种情况下,试试这个:

 func listenVolumeButton() { do { try audioSession.setActive(true) } catch { print("some error") } audioSession.addObserver(self, forKeyPath: "outputVolume", options: NSKeyValueObservingOptions.new, context: nil) } override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if keyPath == "outputVolume" { print("got in here") } } 
 import AVFoundation import MediaPlayer override func viewDidLoad() { super.viewDidLoad() let volumeView = MPVolumeView(frame: CGRect.zero) for subview in volumeView.subviews { if let button = subview as? UIButton { button.setImage(nil, for: .normal) button.isEnabled = false button.sizeToFit() } } UIApplication.shared.windows.first?.addSubview(volumeView) UIApplication.shared.windows.first?.sendSubview(toBack: volumeView) } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) AVAudioSession.sharedInstance().addObserver(self, forKeyPath: "outputVolume", options: NSKeyValueObservingOptions.new, context: nil) do { try AVAudioSession.sharedInstance().setActive(true) } catch { debugPrint("\(error)") } } override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) AVAudioSession.sharedInstance().removeObserver(self, forKeyPath: "outputVolume") do { try AVAudioSession.sharedInstance().setActive(false) } catch { debugPrint("\(error)") } } override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { guard let key = keyPath else { return } switch key { case "outputVolume": guard let dict = change, let temp = dict[NSKeyValueChangeKey.newKey] as? Float, temp != 0.5 else { return } let systemSlider = MPVolumeView().subviews.first { (aView) -> Bool in return NSStringFromClass(aView.classForCoder) == "MPVolumeSlider" ? true : false } as? UISlider systemSlider?.setValue(0.5, animated: false) guard systemSlider != nil else { return } debugPrint("Either volume button tapped.") default: break } } 

当观察新值时,我将系统音量设置回0.5。 这可能会激怒用户同时使用音乐,因此我不build议我自己在生产中的答案。