macos后台任务受沙盒严格限制,仅能访问自身容器目录、tmp目录、用户显式授权的安全书签路径及声明的系统资源;持续访问需完整安全书签流程与三项entitlements配置。

macOS 后台任务必须在沙盒约束下运行,不能因“后台”身份获得额外文件或系统权限。所有访问行为仍需用户显式授权、安全书签持久化、正确 entitlements 配置,缺一不可。
后台任务能访问哪些路径?
沙盒对前台与后台一视同仁——默认只允许:
- 自身容器目录(~/Library/Containers/
/Data/ )及其子目录(Documents、Caches、Application Support 等) - 临时目录(~/Library/Containers/
/Data/tmp/ ) - 用户曾通过
NSOpenPanel或NSSavePanel显式选择并生成有效安全书签的文件或文件夹 - 经声明且用户授权的系统资源(如 Photos、Contacts、Calendar)
如何让后台任务持续访问用户文件夹?
不能依赖“上次选过就一直可用”,必须走完整凭证链:
- 首次访问:用
NSOpenPanel弹出选择框(canChooseDirectories = true),获取用户手动确认的 URL - 生成书签:调用
url.bookmarkData(options: .withSecurityScope),确保isStale == false - 安全存储:将 bookmarkData 保存在自身容器内(例如
FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first) - 后台启动时:用
URL.resolvingBookmarkData(_:)恢复 URL,并立即调用startAccessingSecurityScopedResource() - 完成操作后:务必调用
stopAccessingSecurityScopedResource(),否则后续访问会失败
entitlements 与 Info.plist 必须同步启用
仅写代码不生效,Xcode 中需三项配置全部到位:
- Signing & Capabilities → App Sandbox:开启(自动生成
com.apple.security.app-sandbox) - 勾选 “User Selected File Access”(生成
com.apple.security.files.user-selected.read-write) - 如需跨重启访问书签,必须启用 “App Sandbox Bookmarks”(生成
com.apple.security.files.bookmarks.app-scope)
Info.plist 中若涉及敏感资源(如照片库),还需对应添加 NSPhotoLibraryUsageDescription 等使用说明键值。
常见后台崩溃原因
Operation not permitted 报错几乎都源于以下任一环节缺失:
- 忘记在访问前调用
startAccessingSecurityScopedResource() - 未在操作完成后调用
stopAccessingSecurityScopedResource() - 把 bookmarkData 存到了沙盒外路径(如
/tmp或硬编码全局路径) - 恢复书签时未检查
isStale,直接使用过期凭证 - entitlements 缺少对应权限键值,或 Xcode Capabilities 未真正勾选生效











