iOS 15如何接收SystemVolumeDidChange通知检测音量按键按下
iOS 15 非官方音量按键按下检测实现方案
1. 通知注册代码修改
iOS 15 之后原有的AVSystemController_SystemVolumeDidChangeNotification已被系统废弃替换,你需要更换为新的私有通知名完成监听,修改后的注册代码如下:
Objective-C 版本
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(volumeChanged:) name:@"SystemVolumeDidChange" object:nil];
Swift 版本
NotificationCenter.default.addObserver(self, selector: #selector(volumeChanged(_:)), name: NSNotification.Name(rawValue: "SystemVolumeDidChange"), object: nil)
2. 通知回调逻辑
回调触发时可从userInfo中解析出音量值、触发类型等信息,可通过Reason字段判断是否为用户手动按下按键触发:
- (void)volumeChanged:(NSNotification *)noti { NSDictionary *info = noti.userInfo; CGFloat newVolume = [info[@"Volume"] floatValue]; NSInteger triggerType = [info[@"Reason"] integerValue]; // triggerType等于1时为用户手动按音量键触发,其他值为系统自动调整音量 if (triggerType == 1) { // 自定义按键触发后的业务逻辑 } }
3. MPVolumeControllerSystemDataSource 相关说明
该类属于MediaPlayer框架的私有类,无需你手动查找引入头文件,仅监听上述通知即可满足音量按键检测需求。如果确实需要访问该类的方法,可通过runtime动态获取类对象:
Class dataSourceCls = NSClassFromString(@"MPVolumeControllerSystemDataSource");
提醒:私有API调用存在App Store审核风险,且后续系统版本可能随时变更实现逻辑,需自行评估使用风险。
额外注意事项
- 建议提前初始化一个
MPVolumeView实例添加到当前视图层级,即使设置为隐藏也可避免部分场景下通知不触发的问题 - 不要在回调中主动修改系统音量,否则会触发循环调用
内容的提问来源于stack exchange,提问作者viedev
相关产品推荐
相关产品推荐

