沙盒应用访问被拒时,系统会记录明确日志:通过log show查TCC拒绝(如kTCCServiceSystemPolicyAllFiles)、控制台搜进程报错、sandboxd日志看底层deny操作,并核对entitlements与Info.plist权限声明是否匹配。

沙盒应用访问系统资源被拒绝时,系统不会静默失败,而是会留下明确的日志线索——关键在于知道去哪里找、怎么看、怎么关联。
查 TCC 日志确认是否被隐私控制拦截
TCC(Transparency, Consent, and Control)负责管理用户授权类访问,比如摄像头、位置、文件系统等。一旦被拒,日志会直接记录原因:
- 打开终端,运行:log show --predicate 'subsystem == "com.apple.TCC" AND eventMessage contains "denied"' --last 24h
- 重点关注字段:service(如 kTCCServiceSystemPolicyAllFiles)、bundle_id(你的 App ID)、result(denied)
- 若看到
kTCCServiceSystemPolicyAllFiles被拒,说明 App 尝试未经用户选择就读写任意文件夹,这是沙盒+TCC 双重限制的典型表现
看控制台中实时报错与进程上下文
“控制台”App 是最直观的入口,尤其适合复现问题时同步观察:
- 启动控制台 → 左侧选本机 → 顶部搜索栏输入:process: YourAppBundleID(例如
process: com.example.sma) - 触发拒绝操作(如点击“导入文件夹”),立即筛选出带 Operation not permitted 或 Permission denied 的条目
- 双击日志,查看完整消息;注意 sender(通常是
kernel或sandboxd)和 subsystem(如com.apple.security.sandbox)
检查 sandboxd 的主动干预记录
macOS 内核级沙盒守护进程 sandboxd 会在权限越界时介入并记日志,这类日志更底层、更权威:
- 终端执行:log show --predicate 'process == "sandboxd" AND eventMessage contains "deny"' --last 1h
- 典型输出含:
deny file-read-data、deny sysctl-read、deny network-outbound等,后接具体路径或端口 - 若出现
deny file-write* /Users/xxx/Library/Application Support,说明 Info.plist 缺少com.apple.security.files.user-selected.read-write权限声明
验证 entitlements 和 Info.plist 是否匹配行为
日志显示“拒绝”,但根源常在配置缺失——系统按 entitlements 执行策略,不匹配就直接拦:
- 用 codesign -d --entitlements :- /path/to/YourApp.app 提取当前签名 entitlements,确认含所需键(如网络、相册、用户选中文件)
- 比对 Info.plist 中是否声明对应键值,例如:
<key>com.apple.security.network.client</key><true/> - 常见疏漏:Xcode Capabilities 开了“Network”,但 entitlements 文件没同步更新;或开了“User Selected File Access”,却忘了勾选“Read/Write”子项


















