AXIsProcessTrustedWithOptions returns NO 即使该应用程序在白名单中

AXIsProcessTrustedWithOptions returns NO even though the app is on the whitelist

我们有一个 Mac App Store 应用程序需要访问辅助功能 API。从 10.9 Mavericks 开始,对于想要使用辅助功能的应用程序有一个系统白名单 API(系统偏好设置 → 安全和隐私 → 辅助功能)。

在测试我们应用程序的更新时,我们注意到从旧版本升级后,系统立即告诉我们我们无权使用辅助功能 API (AXIsProcessTrustedWithOptions returns NO), 即使我们的应用程序在白名单上,并且选中了复选框。一旦我们取消选中并重新检查权限,一切正常。

显然,这不是我们可以接受的table升级方案,特别是因为可访问性白名单深埋在系统偏好设置中,无法从代码访问。

这是系统错误吗?有已知的解决方法吗?我们可以接受在大更新后必须重新检查辅助功能权限——将您的用户导航到系统偏好设置只是为了看到复选框已经被选中,而该功能没有工作,这很糟糕。

更新:


在第一次 post 升级启动期间,系统在控制台中抱怨:

16/03/15 06:47:10,343 tccd[190]: Unable to verify code signing identity of com.company.app:  code failed to satisfy specified code requirement(s)
16/03/15 06:47:10,350 universalAccessAuthWarn[401]: AccessibilityAPI: pid 471, is not allowed to access the accessibility API. Path: /path/to/app

奇怪的是,一旦取消选中并重新选中可访问性白名单上的权限复选框,即使二进制文件相同,在后续启动期间控制台中也没有错误。


我已经深入了解了实现访问白名单 (/Library/Application Support/com.apple.TCC/TCC.db) 的 SQLite 数据库。 access table 包含一个 csreq 列,看起来像某个应用程序 fingerprint/hash blob:

$ sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db 'select client, quote(csreq) from access'
com.apple.dt.Xcode|X'…'
com.apple.AccessibilityInspector|X'…'
com.ourcompany.app|X'…'

(引用的哈希值已替换为“...”。)

现在,如果我安装旧版本的应用程序并 运行 它,系统会计算一个哈希值并将其存储在 csreq 列中。如果我执行全新应用程序版本的全新安装,我会得到不同的哈希值。

当我安装旧版本然后删除它时,该列仍然包含旧版本的哈希值。这可能是问题的根源吗?因为当我在更新应用程序之前将列设置为 NULL 时,一切正常。一个新的散列被计算出来,可访问性 API 检查 returns YES 它应该。


Same issue in a different app GitHub.

有一种东西叫做指定要求(见Code Signing Guide)。粗略地说,这是系统用来确定两个应用程序包是否代表同一个应用程序的一组标准,安全方面。可以使用codesign -dvv --req - YourApp.app 命令显示指定的要求。在我们的例子中,指定的要求检查失败了,因为旧的应用程序版本是使用与开发版本不同的证书签名的。

换句话说,当尝试用开发版本替换 Mac App Store 版本时,安全检查将因证书不匹配而失败,您将不得不重新检查某些应用程序权限。据我所知,当您通过 Mac App Store 分发和安装相同的版本时,不会发生这种情况。