macos 应用沙盒是内核强制执行的运行时约束,非可选功能;启用后默认仅可读写自身容器目录(~/library/containers//data/)和tmp目录,访问其他路径或硬件须经用户显式授权、正确配置entitlements及安全书签管理。

macOS 应用沙盒不是可选功能,而是由内核强制执行的运行时约束。启用后,应用默认无法访问 ~/Documents、~/Desktop、/Applications 等常见路径,也不能直接读写硬件设备(如摄像头、麦克风、USB 设备),所有越界操作都会被拦截并返回 Operation not permitted 错误。
文件系统访问受限范围明确
沙盒应用天然可读写的路径仅限以下两类:
- 自身容器目录:
~/Library/Containers/<bundle-id>/Data/</bundle-id>(含Documents、Caches、Preferences等子目录) - 临时目录:
~/Library/Containers/<bundle-id>/Data/tmp/</bundle-id>
其他任何路径(包括用户主目录下的标准文件夹)均需用户显式授权。硬编码路径(如 FileManager.default.urls(for: .documentDirectory, in: .userDomainMask))会直接失败,必须通过 NSOpenPanel 或 NSSavePanel 弹出系统对话框,由用户手动选择文件或文件夹。
硬件访问必须声明并获用户授权
摄像头、麦克风、位置服务、通讯录、日历等资源不属文件系统范畴,但同样受沙盒管控。使用前需满足三项条件:
- 在 Xcode 的 Capabilities 中开启对应权限(如 Camera、Microphone)
- 在
Info.plist中添加用途说明键(如NSCameraUsageDescription),否则首次调用会崩溃 - 首次访问时触发系统授权弹窗,用户拒绝后,后续调用将静默失败
打印功能是例外——即使未勾选 Hardware 权限,App 默认菜单中的“打印”项仍可工作,但自定义打印逻辑(如直接调用 NSPrintOperation)仍需显式启用 Printing 权限。
持久化访问需配合安全书签机制
用户一次授权只在当前会话有效。若需重启后继续访问某文件夹(如监控下载目录变化),必须:
- 调用
url.bookmarkData(options: .withSecurityScope)生成书签数据 - 将书签存入自身容器内(如
Application Support目录),不可存到/tmp或全局路径 - 下次启动时用
URL.resolvingBookmarkData(_:)恢复 URL,并再次调用startAccessingSecurityScopedResource() - 每次读写前必须
startAccessing,完成后立即stopAccessing,漏掉任一环节都会报错
网络与进程通信也受沙盒约束
联网能力并非默认开放:
- 出站连接(如 HTTP 请求)需声明
com.apple.security.network.client - 监听端口(如内置 Web Server)需额外启用
com.apple.security.network.server - 跨进程通信(XPC、Mach 服务)默认禁止,除非申请
com.apple.security.temporary-exception.mach-lookup.global-name(仅限调试,不可上架)
临时例外权限(temporary-exception 类)在 Mac App Store 审核中会被直接拒收,不能用于发布版本。











