如何获取一个AXUIElement对应的Objective-C class名称?

How to get the Objective-C class name corresponding to an AXUIElement?

Apple 的辅助功能检查器工具显示 Objective-C class 对应于当前检查的 UI 元素。请参阅此屏幕截图最底部的 NSButtonCell

但是,如何在我自己的代码中提取这些信息? Apple's seven year old UIElementInspector sample code 中的可访问性方法不会显示元素的 class 名称。

逆向工程辅助功能检查器暗示可以通过 AXClassName 属性获得 Objective-C class 名称,但该属性对我来说始终为 nil。

AppKit 将对 AXClassName 属性和其他几个属性的访问限制为具有 com.apple.private.accessibility.inspection 权利的应用程序。 Accessibility Inspector 用于访问辅助信息的 XPC 服务具有此权限。由于这是私有授权,我相信它只能添加到由 Apple 证书签名的应用程序中。

您可以通过从 Accessibility Inspector 的 XPC 服务中剥离权利来自己确认权利是关键(首先备份 Accessibility Inspector!):

codesign -f -s - /Applications/Xcode.app/Contents/Applications/Accessibility\ Inspector.app/Contents/Frameworks/AccessibilityAuditDeviceManager.framework/XPCServices/axAuditService.xpc

如果您随后打开 Accessibility Inspector,您会发现大部分功能都可以正常工作,除了 class 名称之类的东西在私有权限上是封闭的。

具有授权 XPC 服务的辅助功能检查器

具有un授权的 XPC 服务

的辅助功能检查器