macOS 中沙盒机制与辅助功能权限是独立且需协同配置的两套安全体系:沙盒限制资源访问,辅助功能权限控制进程交互;二者不可互替,应用需同时满足沙盒合规性与用户手动授权辅助功能权限才能实现窗口控制、全局快捷键等功能。

macOS 中的沙盒机制和辅助功能权限是两套独立但常需协同配置的安全体系。沙盒控制应用能访问哪些文件、网络和系统资源;而辅助功能权限(Accessibility)则决定应用能否监听或操控其他进程、界面元素、键盘鼠标事件等。二者不能互相替代——开启沙盒不自动获得辅助功能权限,反之亦然。要让一个沙盒应用合法实现如窗口控制、全局快捷键、进程拦截等功能(例如 noTunes 或 OpenClaw),必须同时满足沙盒合规性与辅助功能授权。
沙盒本身不限制辅助功能权限申请
沙盒不会阻止应用请求辅助功能权限,但要求该请求必须由用户主动触发并确认。系统会在首次调用相关 API(如 AXIsProcessTrustedWithOptions 或 CGEventTapCreate)时弹出系统级提示框。此时应用仍处于沙盒环境中,仅需确保:
- Info.plist 中未声明任何与辅助功能直接相关的 entitlements(这类权限不由 entitlements 控制,而是由 TCC 数据库统一管理)
- 应用签名有效,且 bundle identifier 在系统中唯一可识别
- 不依赖临时例外(如
com.apple.security.temporary-exception.*)来绕过沙盒去“模拟”辅助功能行为
辅助功能权限需用户手动授权
授权不是代码能自动完成的操作,必须引导用户进入系统设置完成勾选:
- 路径:系统设置 → 隐私与安全性 → 辅助功能(需滚动查找)
- 若应用未出现在列表中,点击右下角“+”号,定位到应用的 .app 文件(通常在 /Applications/ 下)
- 勾选后,重启应用才能生效;部分功能(如事件监听)可能还需重新初始化事件源
- 可通过命令行重置状态:
tccutil reset Accessibility com.yourcompany.yourapp,便于开发调试
沙盒内调用辅助功能 API 的注意事项
即使获得辅助功能权限,沙盒仍约束着应用的数据存放与行为边界:
- 所有敏感操作日志、配置缓存、历史记录等,必须存于自身容器目录(
~/Library/Containers/<bundle-id>/),不可写入全局路径 - 若需持久化监听状态(如后台持续捕获快捷键),应使用 XPC Service 拆分逻辑:主 App 负责 UI 和用户授权,XPC Helper 进程负责高权限操作,并通过沙盒间安全通信传递结果
- 避免在辅助功能授权检查中硬编码路径或读取沙盒外文件——这会触发 Operation not permitted,与辅助功能无关,而是沙盒文件权限问题
审核与发布的关键红线
Mac App Store 审核对这两类权限均有严格要求:
- 辅助功能权限必须有明确、必要且向用户说明的功能依据(如“用于实现全局暂停播放快捷键”),不能模糊表述为“提升体验”
- 沙盒 entitlements 必须最小化:只声明实际用到的键值(如
com.apple.security.network.client),禁用temporary-exception类权限 - 应用描述页、隐私政策中需清晰说明为何需要辅助功能权限,以及如何使用所获取的数据(Apple 不替你担责)


















