Sonoma 14.2.1下NSWindow.windowNumbers无法获取可见窗口ID求助
问题分析与解决思路
核心问题
升级至Sonoma 14.2.1后,部分Intel芯片iMac及Air机型调用NSWindow.windowNumbers(options: [.allSpaces, .allApplications])无法获取Finder、Chrome、终端等常规可见窗口的ID,导致后续窗口筛选逻辑完全不执行;Ventura系统下正常,多数M1/M2设备无此异常。
排查与解决方向
1. 检查权限配置
Sonoma对隐私权限管控进一步收紧,需重点确认以下权限:
- 确保应用已在「系统设置 > 隐私与安全性 > 屏幕录制」中获得授权
- 同时检查「辅助功能」权限是否开启
- 权限变更后必须重启应用,避免缓存影响
2. 验证API参数与兼容性
Sonoma可能对NSWindow.windowNumbers(options:)的返回逻辑做了架构专属调整:
- 尝试单独使用
.allSpaces或.allApplications参数,排查组合参数是否触发异常 - 对比Intel与M系列设备上该API的返回结果,确认是否存在架构差异
- 核对Xcode中该API的注释文档,确认Sonoma版本的行为变更
3. 直接基于CGWindowListAPI完成筛选
既然已调用CGWindowListCopyWindowInfo,可绕过NSWindow.windowNumbers的问题,直接完善现有逻辑:
- 移除对
visibleWindowNumbers的依赖,保留原有核心判断条件即可完成筛选 - 优化后的判断逻辑示例:
if info[kCGWindowIsOnscreen] as? Bool == true && app != nil && app!.activationPolicy == .regular && info[kCGWindowLayer] as! Int == 0 && info[kCGWindowAlpha] as! CGFloat > 0 && // 额外排除Finder的桌面背景窗口 !(info[kCGWindowName as NSString] as? String == nil && app?.bundleIdentifier == "com.apple.finder") { visibleWindowsInfoDicts.append(info) }
4. 排查系统设置影响
部分系统功能可能干扰窗口枚举:
- 检查是否开启「台前调度」,Sonoma中台前调度的窗口管理逻辑可能导致跨空间窗口无法被
NSWindow.windowNumbers枚举 - 关闭台前调度后重启应用,验证问题是否消失
- 检查多显示器或空间配置,这类差异可能影响API返回结果
5. 尝试异步调用API
Sonoma中部分系统API可能改为异步逻辑,同步调用可能无法获取完整结果:
- 在
DispatchQueue.main.async中调用NSWindow.windowNumbers,确保在主线程且系统状态稳定后执行 - 对比同步与异步调用的返回结果差异
内容的提问来源于stack exchange,提问作者Ross Stepaniak
相关产品推荐
相关产品推荐

