You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:06:03