“operation not permitted”本质是沙盒越权访问警告,非权限故障;需依日志拒绝类型(如ktccservicesystempolicyallfiles)确认缺失授权,正确配置info.plist权限键、持久化安全书签至应用容器内,并调用start/stop配对访问。

macOS 沙盒环境下的权限管理错误日志,本质不是“报错需要修复”,而是系统在告诉你:应用试图越权访问,而你还没走合规路径。关键不在日志本身,而在日志背后暴露的授权缺失或操作失当。
看懂日志里的拒绝类型
出现 “Operation not permitted” 时,别急着 chmod 或 sudo。先确认是否真被沙盒拦截:
- 查错误发生的具体路径:是不是直接读写
~/Documents、~/Desktop或外接磁盘?这些位置默认不可直连 - 运行
ls -lOe ~/Documents,若输出含restricted或com.apple.quarantine,说明该路径受沙盒或 TCC 策略管控 - 打开系统日志(需先启用):
log config --mode "level:info,persist:debug",再查/Library/Logs/TCC/tcc.log,搜索你的 App Bundle ID,重点关注拒绝类型:-
kTCCServiceSystemPolicyAllFiles→ 应用没声明全盘访问权限,且未通过用户选择获得书签 -
kTCCServiceFileProviderDomain→ 尝试访问 iCloud 或第三方文件提供者,但未配置对应 entitlement 或未触发用户授权
-
Info.plist 权限键必须显式声明
即使用户点过“选择文件夹”,没有正确配置 Info.plist,后续访问仍会失败。必须手动检查并确保包含以下键值:
利用 macOS 原生能力实现本地语音识别与合成。通过 yap (Apple Speech.framework) 进行语音转文字,通过 say + ffmpeg 进行文字转语音。完全离线,无需 API 密钥。具备音质检测与智能选声功能。
-
com.apple.security.files.user-selected.read-write→ 值设为true(用于用户选中的目录读写) -
com.apple.security.assets.photos→ 若需读取照片库 -
com.apple.security.automation.apple-events→ 若调用 AppleScript 或控制界面
Xcode Capabilities 中勾选 “User Selected File Access” 可自动生成,但建议打开 Info.plist 文件人工核对,避免因 Xcode 缓存或版本差异漏掉。
安全书签没存对地方,等于没存
很多崩溃源于 bookmarkData 保存失败或恢复失效:
- 不能存在
/tmp、/var或用户家目录根下——沙盒应用无权读取这些路径 - 应存入自身容器内,例如:
FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first?.appendingPathComponent("bookmarks.dat") - 恢复书签后,必须调用
url.startAccessingSecurityScopedResource()才能真正读写;操作结束立即配对stopAccessing,否则资源锁住,下次启动可能失效
日志里反复出现“no access”却没弹窗?检查辅助功能与自动化权限
如果日志显示 kTCCServiceAccessibility 拒绝,说明应用尝试执行界面操作(如模拟点击、获取窗口信息),但没拿到辅助功能授权:
- 不能仅靠系统设置里手动勾选——该授权易被重置,尤其 macOS 更新后
- 首次启动时,用 AppleScript 触发授权流程(需用户交互),或引导用户前往“系统设置 > 隐私与安全性 > 辅助功能”手动添加
- Electron 应用注意:
app.dock.show()或主窗口创建前,必须已完成书签恢复和startAccessing,否则部分 API 调用会静默失败










