macos应用沙盒容器目录为~/library/containers//data/,由内核强制隔离,仅默认允许访问自身容器内的documents、library(含preferences/caches/application support)和tmp子目录;用户需通过nsopenpanel授权并配合security-scoped bookmarks持久化访问外部路径,且info.plist必须正确声明com.apple.security.app-sandbox等权限键。

macOS 应用沙盒容器目录是每个启用 App Sandbox 的应用在系统中被隔离存放数据的专属空间,路径固定为:~/Library/Containers/
容器根目录下的标准子目录及其用途
进入 ~/Library/Containers/<bundle-id>/Data/</bundle-id> 后,你会看到以下常见子目录,它们有明确分工和系统级行为差异:
- Documents:用于存放用户生成、需长期保留且可能被 Time Machine 或 iCloud 同步的数据(如文档、项目文件)。iTunes/macOS 备份时默认包含此目录。
-
Library:包含多个功能子目录:
- Preferences:存储 NSUserDefaults 或 CFPreferences 写入的偏好设置,备份时保留;
- Caches:存放可随时重建的缓存数据(如网络响应、缩略图),系统可能在磁盘紧张时自动清理;
- Application Support:放置应用运行必需的支持文件(数据库、配置模板、插件等),不参与备份,但需持久化;
- Logs 和 WebKit 等子目录则按需存在,由框架或 SDK 自动创建。
-
tmp:对应
NSTemporaryDirectory()返回的路径,仅限临时文件。系统可能在重启后清空,且不保证内容留存; -
Shared(非默认存在):仅当应用声明了
com.apple.security.application-groups权限,并加入同一 Group 时才会出现,用于同组应用间安全共享数据。
哪些路径不在容器内,但可合规访问?
沙盒容器外的路径默认全部拒绝访问。只有以下三类情况例外,且均有严格前提:
- 用户通过
NSOpenPanel或NSSavePanel显式选择的单个文件或整个文件夹(需启用canChooseDirectories = true); - 经
Security-Scoped Bookmarks持久化并正确调用startAccessingSecurityScopedResource()/stopAccessingSecurityScopedResource()的已授权 URL; - 系统级受信资源,如照片库(Photos.framework)、通讯录(Contacts.framework)、日历(EventKit)、麦克风/摄像头(需 Info.plist 中声明对应权限键并弹窗授权)。
开发中必须注意的关键细节
容器结构看似简单,但实际使用中极易因配置疏漏导致 Operation not permitted 错误:
- Info.plist 中必须显式开启沙盒并声明所需能力,例如:
com.apple.security.app-sandbox(必选)、com.apple.security.files.user-selected.read-write(访问用户选中路径)、com.apple.security.files.downloads.read-write(下载目录)等; - Bookmark 数据必须保存在自身容器内(如
applicationSupportDirectory),不可存到/tmp或硬编码全局路径; - 每次访问前必须调用
startAccessing...,访问结束后立即配对调用stopAccessing...;遗漏任一环节,重启后访问即失败; - Xcode Capabilities 面板勾选“App Sandbox”会自动生成基础配置,但高级权限(如访问下载目录、辅助功能)仍需手动添加键值。
如何快速定位某个应用的容器路径?
不需要依赖 Xcode 或模拟器,日常开发调试可直接通过终端确认:
- 查出目标应用的 Bundle ID(如
com.example.myapp),执行:ls ~/Library/Containers/com.example.myapp/Data/ - 若不确定 Bundle ID,可在 Finder 中打开
~/Library/Containers/,启用显示隐藏文件(Cmd+Shift+.),按应用名称大致识别文件夹名; - 也可用命令列出所有容器:
ls ~/Library/Containers/ | grep -i "myapp"











