xcode - AXUIElementCopyAttributeNames 在 Cocoa App 中返回 cannotComplete 但在操场上运行良好
问题描述
我正在尝试构建一个实用程序来导航到任何可见且已启用的 ui 元素,而无需鼠标或触控板,因此我必须首先枚举这些元素。
我做了一些研究,发现无障碍 API 可能会帮助我实现目标。然后我在操场上尝试了它们,如下所示:
//...
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 在 System Preferences > Security and Privacy > Privacy > Accessibility 中启用。AXIsProcessTrustedWithOptions 总是返回 true 似乎这不是权限问题。
我怎样才能让它工作?我错过了任何必要的设置吗?
我英语不好,抱歉。
解决方案
我通过关闭 App Sandbox 解决了这个问题。我仍然很好奇为什么沙盒中没有可访问性权利。鉴于我没有计划将我的应用程序放在 Mac App Store 中,关闭 App Sandbox 对我来说是一个解决方案。
感谢大家。
推荐阅读
- html - Hide/close container using uk-close button
- r - R:如何删除 X 轴上未绘制的名称(留下已绘制的名称)?
- oracle - 在 Oracle 中将字母数字转换为 nchar()
- c++ - 为什么 libxml 不在我的 htmlDocPtr 中存储 html?
- visual-studio-code - 如何根据文本过滤掉VSCode中的问题?
- json.net - Newtonsoft Json DynamicValueProvider 和 ReflectionValueProvider 的区别?
- c# - 为什么我的代码不会反序列化到我的模型中?
- ado.net - 如何为现有的已修改强类型 DataSet 获取 DataAdapter 或从其获取 DataAdapter?
- visual-studio - Arduino AES128 加密 - C# 解密填充问题
- exiftool - 从 Lightroom 导出后如何使用 Exiftool 将 jpg 元数据复制到 RAW 文件