如何在自研macOS应用中识别活跃前台应用的关联打开文件
macOS 获取活跃应用关联文件名/标题的实现思路
你已经可以通过 NSWorkspace.shared.frontmostApplication?.localizedName 稳定识别前台活跃应用,后续获取关联文件名/页面标题可以参考以下可落地的技术路径:
通用跨应用实现方案
基于系统公开的辅助功能(AXUIElement)框架实现,不需要针对单应用做专属适配,是覆盖场景最广的方案:
- 通过前台活跃应用的
NSRunningApplication实例,提取其进程标识符(processIdentifier),创建对应应用的AXUIElement引用:AXUIElementCreateApplication(frontmostApp.processIdentifier) - 读取该AX元素的
kAXWindowsAttribute属性,获取应用当前打开的所有窗口对象列表 - 对每个窗口读取
kAXTitleAttribute属性,拿到的窗口标题内容,就是绝大多数场景下你需要的关联标识:比如Chrome当前激活标签页的标题、访达窗口展示的文件名、文档应用打开的文件名称都会直接体现在窗口标题中
注意:该方案需要用户手动在「系统设置-隐私与安全性-辅助功能」中为你的自研应用授权,未授权状态下AX接口会返回空值。
高精度定向适配方案
如果对识别结果的准确度要求较高,可以针对高频使用的应用单独对接其公开的脚本桥接接口:
- 针对Chrome、Safari这类浏览器:通过AppleScript直接读取当前激活标签页的原始标题,避免窗口标题上叠加的未读消息数、应用版本提示等附加文字对识别结果的干扰
- 针对Word、文本编辑这类文档类应用:通过AppleScript读取当前聚焦文档的真实存储路径与文件名,不依赖窗口标题的展示文案
常见实现误区
- 不要尝试通过遍历进程打开的文件句柄反推用户当前查看的文件:这类方式只能拿到应用进程总共打开了哪些文件,完全无法区分用户当前聚焦的是哪一个窗口、哪一个标签页,和场景需求的匹配度极低
- 不要依赖应用的私有API实现功能:系统或应用版本迭代后,私有接口失效会直接导致功能不可用,优先选择系统公开的AXAPI与标准AppleScript桥接通道
内容的提问来源于stack exchange,提问作者michaeldebo
相关产品推荐
相关产品推荐

