macos沙盒应用启用辅助功能需三项配置缺一不可:info.plist添加nsaccessibilityusagedescription描述、xcode启用hardened runtime、运行时调用axisprocesstrustedwithoptions引导用户授权并监听系统通知,缺一则在macos 13+失效。

macOS 沙盒应用调用辅助功能(Accessibility)框架,不能仅靠 entitlements 或 Info.plist 配置完成。它属于系统级敏感权限,需用户在“系统设置 → 隐私与安全性 → 辅助功能”中手动授权,且沙盒环境对此有额外约束——必须配合代码主动检测与引导,否则即使用户授过权,重启后也可能失效。
必须完成的三项配置
缺一不可,否则 AXIsProcessTrustedWithOptions 返回 false 或静默失败:
-
Info.plist 中添加使用描述键:
NSAccessibilityUsageDescription,值为清晰说明用途的字符串(如“用于监听键盘输入以实现快捷操作”),系统首次调用时会据此弹出授权提示 - Xcode Signing & Capabilities 中启用 Hardened Runtime:辅助功能权限在 hardened runtime 下才被系统严格校验,未启用时可能绕过或行为不稳定
-
entitlements 文件无需额外声明:辅助功能不依赖 sandbox entitlement(如
com.apple.security.app-sandbox已开启即可),但不能禁用 Hardened Runtime,否则权限检查会被跳过
运行时检测与用户引导逻辑
沙盒应用无法自动获得辅助功能权限,必须由代码触发并友好引导:
- 调用
AXIsProcessTrustedWithOptions(@{(__bridge id)kAXTrustedCheckOptionPrompt: @YES}),系统会弹出标准授权窗口(仅首次有效) - 若返回
NO,应提供按钮跳转到系统设置页:NSWorkspace.shared.open(URL(string: "x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility")!) - 避免轮询检测——可在 App 启动、首次需要监听事件前执行一次;后续可缓存结果,但需监听
NSWorkspace.didChangeAccessibilityEnabledNotification响应用户手动关闭
常见失效原因与修复
很多沙盒应用在打包发布后辅助功能突然失效,主因是:
- 使用了
tccutil reset Accessibility脚本重置权限,但沙盒应用的 bundle ID 在重置后未被重新识别(尤其带版本号或变体 ID 时) - 在非主线程调用
AXIsProcessTrustedWithOptions,导致弹窗被拦截或无响应 - Info.plist 缺少
NSAccessibilityUsageDescription,系统拒绝弹窗,且控制台输出明确警告(Xcode Console 可见 “No usage description”) - 应用签名不完整(如未用 Apple Developer ID 签名或公证失败),Hardened Runtime 拒绝加载辅助功能 API
沙盒下辅助功能不是“配完就通”,而是“声明 + 弹窗 + 用户确认 + 运行时校验”的闭环流程。跳过任一环节都可能在 macOS 13+ 系统上直接失败。











