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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:20:30