【问题标题】:AXUIElementCopyAttributeNames returns cannotComplete in Cocoa App but works well in playgroundAXUIElementCopyAttributeNames 在 Cocoa App 中返回 cannotComplete 但在 Playground 中运行良好
【发布时间】:2025-12-31 05:35:16
【问题描述】:

我正在尝试构建一个实用程序来导航到任何可见且已启用的 ui 元素,而无需鼠标或触控板,因此我必须首先枚举这些元素。

我做了一些研究,发现也许辅助功能 API 可以帮助我实现目标。然后我在 playground 中尝试了它们,如下所示:

//...
let key: String = kAXTrustedCheckOptionPrompt.takeUnretainedValue() as String
let options = [key: true]
let enabled = AXIsProcessTrustedWithOptions(options as CFDictionary)

if !enabled {
    print("Not permitted")
    NSApp.terminate(nil)
}

//...

let element = AXUIElementCreateApplication(pid as! pid_t)
var ans : CFArray?
let e = AXUIElementCopyAttributeNames(element, &ans)
if e == .success, let names = ans as? [String] {
    print(names)
}
//...

它在操场上运行良好。然后我创建了一个新的 Cocoa 应用程序,将上面的代码复制到其中,在调试模式下运行它,AXUIElementCopyAttributeNames 返回一个 AXError - cannotComplete。

非常确定 Xcode 在系统偏好设置 > 安全和隐私 > 隐私 > 可访问性中启用。 AXIsProcessTrustedWithOptions 总是返回 true 似乎不是权限问题。

我怎样才能让它工作?我错过了任何必要的设置吗?

我的英语不好,抱歉。

【问题讨论】:

  • 请您正确格式化问题。
  • 如果您希望您的应用能够使用辅助功能 API,那么您还必须在系统偏好设置 > 安全和隐私 > 隐私 > 辅助功能中启用您的应用(不是 Xcode)。 (启用 Xcode 是 Playground 访问所必需的,但不会影响您的应用。)
  • @KenThomases AXIsProcessTrustedWithOptions 总是返回 true 似乎不是权限问题,应用程序是由 Xcode 在调试模式下启动的,也许在 Accessibility 中启用 Xcode 就足够了。但是我已经尝试了您的建议,但问题仍然存在。感谢您的帮助。
  • @PragatiSingh 我是新来的,请告诉我在哪里可以找到有关正确问题格式的信息。

标签: xcode macos


【解决方案1】:

我通过关闭 App Sandbox 解决了这个问题。我仍然很好奇为什么沙盒中没有可访问性权利。鉴于我没有计划将我的应用程序放在 Mac App Store 中,关闭 App Sandbox 对我来说是一个解决方案。

谢谢大家。

【讨论】:

    【解决方案2】:

    “使用 App Sandbox,您可以并且应该启用您的应用程序的可访问性,如 OS X 的可访问性编程指南中所述。但是,您不能对屏幕阅读器等辅助应用程序进行沙盒处理,并且您不能对控制应用程序的应用程序进行沙盒处理另一个应用程序。”

    摘自https://developer.apple.com/library/archive/documentation/Security/Conceptual/AppSandboxDesignGuide/DesigningYourSandbox/DesigningYourSandbox.html

    游乐场没有沙盒,这就是它在那里工作的原因。

    【讨论】:

      最近更新 更多