基于NSDocument的沙箱应用出现Internal sandbox error如何解决?
这是macOS Big Sur(11.x)版本的系统级Bug,和你的开发操作无关,Xcode默认模板可以复现就足以证明是框架本身的问题。
错误原因拆解
sandbox_extension_release error [22: Invalid argument]:NSDocument内部会自动管理沙箱扩展句柄的创建与释放,Big Sur版本的框架存在重复释放无效句柄的逻辑错误,你手动调用stopAccessingSecurityScopedResource会和系统自动触发的释放逻辑冲突,反而会加重报错。sandbox_extension_consume returned 12:上述错误会导致沙箱扩展句柄持续泄漏,虽然你访问的文件数量远低于公开的4000阈值,但Big Sur下存在句柄计数异常的问题,少量累积也会触发沙箱的访问限制,最终完全阻止应用申请新的文件访问权限。
临时规避方案
- 不要手动操作文档对应URL的作用域书签启停逻辑,完全交由
NSDocumentController内部管理 - 遍历
recentDocumentURLs获取文件属性时,不要长时间持有URL对象,每次访问属性前后配对调用作用域书签的启停方法,访问完成后立即释放URL,降低句柄泄漏概率 - 如果需要长期存储最近文件的访问权限,提前为每个文件生成持久化作用域书签本地存储,不要频繁直接访问
recentDocumentURLs返回的URL - 可根据产品场景,在应用空闲时调用
[[NSDocumentController sharedDocumentController] clearRecentDocuments:nil]清空历史句柄,该操作会清空用户的最近文件列表,需要提前做好用户提示。
版本适配说明
该Bug已经在macOS 12.3及以上版本被苹果官方修复,如果你可以将应用的最低部署目标提升到12.3及以上,不需要修改任何业务代码即可彻底解决该问题。
内容的提问来源于stack exchange,提问作者Antifonic
相关产品推荐
相关产品推荐

