macOS开发中如何接收屏幕亮度变化的实时通知
macOS 屏幕亮度变化监听实现方案
macOS 存在等效于iOS UIScreen.brightnessDidChangeNotification 的原生事件监听能力,无需使用轮询方案,以下是两种可直接落地的实现方式:
方案1:系统分布式通知监听(推荐,实现成本最低)
系统会在屏幕亮度发生变更时主动发送全局分布式通知,直接注册监听即可在亮度变化时收到触发回调:
- 通知类型:
NSDistributedNotificationCenter全局分布式通知 - 通知名称:
com.apple.Display.brightnessChanged
代码示例
Swift 实现
import AppKit // 注册监听 DistributedNotificationCenter.default().addObserver( self, selector: #selector(handleBrightnessChange(_:)), name: NSNotification.Name(rawValue: "com.apple.Display.brightnessChanged"), object: nil ) // 回调处理 @objc private func handleBrightnessChange(_ notification: Notification) { // 直接调用你已实现的亮度查询逻辑,获取最新亮度值处理即可 let latestBrightness = getCurrentDisplayBrightness() // 后续业务逻辑 }
Objective-C 实现
#import <AppKit/AppKit.h> // 注册监听 [[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(handleBrightnessChange:) name:@"com.apple.Display.brightnessChanged" object:nil]; // 回调处理 - (void)handleBrightnessChange:(NSNotification *)notification { CGFloat latestBrightness = [self getCurrentDisplayBrightness]; // 后续业务逻辑 }
注意事项
- 该方案默认支持内置屏幕的亮度变化监听,多外接屏幕场景下,收到通知后遍历你已获取的
IODisplayConnect实例分别查询亮度即可。 - 沙盒应用无需额外权限即可正常监听该通知。
方案2:IOKit 底层参数变更监听(兼容性更强)
如果需要适配老旧系统、或者需要精准监听单块外接屏幕的亮度变更,可以通过IOKit框架注册IODisplayConnect服务的参数变更回调,直接监听kIODisplayBrightnessKey对应的参数变化,事件触发时可直接获取对应屏幕的最新亮度值,无需额外查询。
实现需要链接IOKit框架,步骤如下:
- 遍历获取所有
IODisplayConnect服务端口 - 为每个服务端口注册参数变更回调,指定监听
kIODisplayBrightnessKey参数 - 回调触发时直接从返回的参数中读取最新亮度值即可
内容的提问来源于stack exchange,提问作者rid
相关产品推荐
相关产品推荐

