macOS应用沙盒化必须同步配置entitlements与Info.plist权限,否则运行时报Operation not permitted;需通过NSOpenPanel授权、安全书签持久化访问,并严格配对start/stop操作,临时例外权限禁用于发布版本。

macOS 应用沙盒化不是打开开关就完事,权限配置错一处,运行时就会报 Operation not permitted——这不是系统故障,而是沙盒在按规则拦截未授权行为。关键不在“绕过”,而在“合规申请”。
Info.plist 与 entitlements 必须严格对齐
仅在 Xcode Capabilities 中勾选 “App Sandbox” 不够,entitlements 文件和 Info.plist 需同步声明对应能力:
-
文件访问类:需同时配置
com.apple.security.files.user-selected.read-write(或只读)为true,且 Xcode 会自动生成该键,但手动检查 plist 更可靠 -
网络类:出站请求必须声明
com.apple.security.network.client;若监听本地端口(如 HTTP server),还需com.apple.security.network.server -
敏感资源类:访问照片库加
com.apple.security.assets.photos,控制屏幕需com.apple.security.automation.apple-events -
临时例外禁用于发布:
com.apple.security.temporary-exception.*类权限仅限调试,Mac App Store 审核直接拒绝
安全书签(Security-Scoped Bookmark)使用不当
用户选中一次文件夹 ≠ 永久可访问。重启后失效,几乎都因书签流程不完整:
macOS 微信消息自动化工具。通过 GUI 自动化实现:发送消息给指定联系人、读取聊天内容、监控新消息。适用于需要自动化微信操作的场景,如定时发送、批量回复、消息备份等。依赖 peekaboo 进行屏幕截图和 UI 交互。仅支持 macOS。开源地址:https://github.com/chairmanmia...
- 生成书签前,必须先调用
url.startAccessingSecurityScopedResource(),否则bookmarkData为空或无效 - 书签数据只能存于自身沙盒容器内(如
~/Library/Containers/com.yourapp/Data/Library/Application Support/),存到/tmp或全局路径会导致下次启动无法读取 - 恢复书签后,必须再次调用
startAccessingSecurityScopedResource()才能读写;访问结束立即配对stopAccessing,不能遗漏 - 书签可能过期(如用户移动/重命名目标文件夹),恢复时需检查
isStale标志,过期则需重新触发 NSOpenPanel
NSOpenPanel 调用不规范
这是用户授权的唯一合规入口,但常被简化或跳过:
- 不能用硬编码路径(如
~/Documents)直接 open,必须通过NSOpenPanel弹出 Powerbox 对话框 - 设置
canChooseDirectories = true和resolvesAliases = true,确保支持文件夹选择与别名解析 - Electron 等跨平台框架中,需确保
BrowserWindow创建前已完成书签恢复与startAccessing,否则窗口渲染阶段读写会失败 - 首次启动未触发选择,后续所有访问均无权限基础——没有“默认授权”这回事
签名与部署环节疏漏
配置改了,但没正确签名,等于白做:
- 修改 Info.plist 或 entitlements 后,必须重新签名:
codesign --force --deep --sign - /Applications/YourApp.app - 用
codesign -dv --entitlements :- /Applications/YourApp.app可验证实际嵌入的权限列表,确认是否含所需键值 - 打包工具(如 Electron Builder)可能覆盖 entitlements,需检查其配置是否保留自定义权限项
- App Store 提交前,务必用
xcodebuild -exportArchive导出并验证归档包,避免本地调试正常、上架失败

















