http://www.jianshu.com/p/4f2fc34a3a52
1、使用KVO监听属性outputVolume
首先,注册监听
![](https://i-blog.csdnimg.cn/blog_migrate/c4fbbf5423668e3617452fcb477af0f9.webp?x-image-process=image/format,png)
在监听的回调中判断是否是我们监听的属性,所有使用KVO监听的属性都是同一个回调方法,当你子类和父类监听了多个属性,必须进行判断。
![](http://upload-images.jianshu.io/upload_images/1907756-36a392261d075d82.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
当音量增加到最大,或者减低到最小变成静音的时候,系统不会再发送音量改变的消息,就是按下音量键的时候,系统不会调用上面的回调。在iOS7之前可以自己设置音量大小,让音量不会增加到最大或者减少到最低。在iOS7 之后,该方法被弃用。
2、使用通知消息机制:
监听AVSystemController_SystemVolumeDidChangeNotification消息。
![](https://i-blog.csdnimg.cn/blog_migrate/1bcd1953a9ad0734cad4e538b6813d80.webp?x-image-process=image/format,png)
该消息除了监听音量键之外,应用从后台切换到前台也会发送该消息,所以,还需要判断消息的userInfo的字段AVSystemController_AudioVolumeChangeReasonNotificationParameter,确定发送消息的理由,value值为ExplicitVolumeChange就是我们所需要的。
![](https://i-blog.csdnimg.cn/blog_migrate/9bb466a84acff717ba7ff0b8dd28cf65.webp?x-image-process=image/format,png)
3、注意:
使用以上两种方法监听音量键,在用户按下音量键的时候,还是会显示系统的音量键弹出框,也会改变系统的音量大小。我们可以自定义一个弹框,放置在屏幕外面,并且显示。这样就会优先显示我们自定义的弹框,不会显示系统自带的。如果自定义的弹框hidden 为YES,也是会弹出系统的提示框。
![](https://i-blog.csdnimg.cn/blog_migrate/ea482a4cddfa9cc62d0dbccfea712202.webp?x-image-process=image/format,png)
避免改变系统的音量大小的方法还没找到,以我的理解,无论是上面的KVO还是消息通知都是在系统改变音量之后才会发送消息的。