macOS原生Accessibility C FFI介绍

macOS原生Accessibility C FFI,本质上是为了解决“程序如何像用户一样观察和操作其他应用的UI”


解决的核心问题

普通程序只能操作自己的进程:

1
2
3
你的程序

自己的窗口/控件

Accessibility API则提供了一条受系统授权保护的通道

1
2
3
4
5
6
7
8
9
10
11
你的程序

Accessibility API

其他App的UI层级
├─ Window
├─ Button
├─ TextField
├─ Menu
├─ List
└─ ...

因此可以做到:

  • 读取UI:窗口标题、按钮名称、输入框内容、选中状态
  • 定位UI:找到当前焦点元素、子元素、父元素
  • 操作UI:点击按钮、输入文本、执行菜单Action
  • 监听UI:焦点变化、窗口变化、值变化等
  • 自动化桌面App:控制不是自己开发的应用
  • 辅助功能:屏幕阅读器、键盘辅助、替代输入等

为什么需要C FFI

如果你的真正目标是Rust/Go/Zig等语言,那么问题又多了一层:

1
2
3
4
5
6
7
8
9
Rust/Go/Zig

C FFI

ApplicationServices.framework

AXUIElement

macOS其他App

这里的C FFI主要是跨语言边界的薄适配层。它不是为了增加Accessibility能力,而是为了把Apple原生的:

1
2
3
4
5
AXUIElementRef
CFTypeRef
CFStringRef
CFArrayRef
AXError

转换成你的语言容易安全管理的类型。

总结

Accessibility API解决控制别人的UI,C FFI解决“让非Apple语言能够使用这个能力。

如果你的最终目标是做类似AI桌面Agent/自动化机器人,那么Accessibility实际上是macOS上非常核心的一条基础设施。