zou*_*oul 5 macos accessibility mac-app-store
我们有一个需要访问辅助功能 API 的 Mac App Store 应用程序。从 10.9 Mavericks 开始,对于想要使用辅助功能 API(系统偏好设置?安全和隐私?辅助功能)的应用程序,有一个系统白名单。
在为我们的应用程序测试更新时,我们注意到从旧版本升级后,系统告诉我们我们无权使用 Accessibility API(AXIsProcessTrustedWithOptions返回NO),即使我们的应用程序在白名单中,选中复选框。一旦我们取消选中并重新选中权限,一切正常。
显然,这对我们来说不是一个可以接受的升级方案,尤其是因为可访问性白名单在系统偏好设置中深藏不露,无法通过代码访问。
这是系统bug吗?有已知的解决方法吗?我们会接受在大更新后必须重新检查辅助功能权限 - 将您的用户导航到系统偏好设置只是为了看到已经选中的复选框,而该功能没有工作,这很糟糕。
更新:
在第一次升级后启动期间,系统在控制台中抱怨:
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
Run Code Online (Sandbox Code Playgroud)
奇怪的是,一旦可访问性白名单上的权限复选框被取消选中并重新选中,即使二进制文件相同,在后续启动期间控制台中也没有错误。
我已经深入了解了实现访问白名单 ( /Library/Application Support/com.apple.TCC/TCC.db)的 SQLite 数据库。该access表包含一个csreq看起来像一些应用程序指纹/哈希 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'…'
Run Code Online (Sandbox Code Playgroud)
(引用的哈希被替换为“...”。)
现在,如果我安装旧版本的应用程序并运行它,系统会计算一个哈希值并将其存储在csreq列中。如果我执行新应用程序版本的全新安装,我会得到不同的哈希值。
当我安装旧版本然后将其删除时,该列仍包含旧版本的哈希值。这可能是问题的根源吗?因为当我NULL在更新应用程序之前将列设置为时,一切正常。计算出一个新的哈希值,可访问性 API 检查YES按原样返回。
GitHub 上不同应用程序中的相同问题。
有一个叫做指定要求的东西(请参阅代码签名指南)。粗略地说,它\xe2\x80\x99是系统用来确定两个应用程序包是否代表同一个应用程序(安全方面)的一组标准。使用该命令可以显示指定的需求codesign -dvv --req - YourApp.app。在我们的例子中,指定的要求检查失败,因为较旧的应用程序版本是使用与开发版本不同的 \xc2\xa0 证书进行签名的。
换句话说,当尝试用开发版本替换 Mac App Store 版本时,安全检查将因证书不匹配而失败,并且您将必须重新检查某些应用程序权限。据我所知,当您通过 Mac App Store 分发并安装相同的版本时,\xe2\x80\x99 不会发生这种情况。
\n| 归档时间: |
|
| 查看次数: |
617 次 |
| 最近记录: |