AXUIElementCopyAttributeNames在Cocoa App中返回cannotComplete,但在游乐场中效果很好

时间:2018-06-16 02:41:19

标签: xcode macos

我正在尝试构建一个实用程序,导航到任何可见的&在没有鼠标或触控板的情况下启用ui-element,所以我必须首先枚举这些元素。

我做了一些研究,发现可能的辅助功能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 App,将上面的代码复制到其中,在调试模式下运行,AXUIElementCopyAttributeNames返回AXError - cannotComplete。

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

我怎样才能使它有效?我错过了任何必要的设置吗?

我的英语不好,对不起。

2 个答案:

答案 0 :(得分:0)

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

谢谢大家。

答案 1 :(得分:0)

”使用“应用程序沙箱”,您可以并且应该启用应用程序的可访问性,如《 OS X的辅助功能编程指南》中所述。但是,您不能沙盒化辅助应用程序(例如屏幕阅读器),也不能沙盒化控制应用程序的应用程序另一个应用。”

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

操场没有沙盒,这就是为什么它在那里工作的原因。