无法接收NSWorkspaceActiveSpaceDidChangeNotification 其余通知正常问题求助
问题原因与解决方案
1. 沙箱权限限制
- 若你的App开启了App Sandbox,该通知默认会被系统拦截,沙箱环境下无权限获取Space切换相关的系统事件
- 解决方案:
- 无需上架App Store可直接关闭项目配置中的
App Sandbox选项 - 需上架可尝试申请对应特殊权限,该通知默认不在沙箱允许的通知列表内
- 无需上架App Store可直接关闭项目配置中的
2. 观察者对象提前释放
- 你添加监听的
self对象如果在监听后被提前释放,会自动失去通知响应能力 - 解决方案:
- 在
self的dealloc方法中添加日志,确认对象生命周期是否覆盖你需要接收通知的时段 - 务必在对象释放前调用
removeObserver接口移除监听,避免野指针崩溃
- 在
3. 监听操作未在主线程执行
NSWorkspace的通知默认在主线程投递,若你在子线程调用monitor方法执行监听注册,可能出现注册失效的情况- 解决方案:将监听注册逻辑强制放在主队列执行,示例代码:
-(void)monitor { dispatch_async(dispatch_get_main_queue(), ^{ NSNotificationCenter *notcenter = [[NSWorkspace sharedWorkspace] notificationCenter]; // 可尝试将object参数改为nil,部分系统版本下指定发送源可能出现匹配失效问题 [notcenter addObserver:self selector:@selector(activeSpaceDidChange:) name:NSWorkspaceActiveSpaceDidChangeNotification object:nil]; }); }
4. 缺少系统权限
- macOS 10.14及以上版本,部分桌面相关的系统通知需要App拥有辅助功能权限才能接收
- 解决方案:打开
系统设置>隐私与安全性>辅助功能,将你的App添加到权限列表中后重启App测试
5. 系统版本兼容问题
NSWorkspaceActiveSpaceDidChangeNotification仅支持OS X 10.7及以上系统,若你的项目部署目标低于该版本会无法触发- 新版本macOS(13.0+)若开启了台前调度(Stage Manager)功能,部分场景下Space切换逻辑变更也可能导致通知延迟或不触发,可关闭台前调度后复测
内容的提问来源于stack exchange,提问作者a-soll
相关产品推荐
相关产品推荐

