我的 cocoa 应用程序设计是一个 .app(UI)和三个 XPC 服务。
主应用程序需要文件只读以显示powerbox并在 UI 中显示所选路径
- com.apple.security.app-沙盒
- com.apple.security.files.bookmarks.app-scope
- com.apple.security.files.user-selected.read-only
两个 XPC 服务需要文件只读
- com.apple.security.app-沙盒
- com.apple.security.files.bookmarks.app-scope
- com.apple.security.files.user-selected.read-only
一项 XPC 服务需要文件读写
- com.apple.security.app-沙盒
- com.apple.security.files.bookmarks.app-scope
- com.apple.security.files.user-selected.read-write
由于用户交互的流程,主应用程序会打开一个 powerbox 对话框,以允许用户选择一个目录并将其显示在 UI 中。然后,主应用程序将其保存为安全范围的书签。书签数据根据需要通过 XPC 连接发送,每个单独的 XPC 进程解析书签以访问其自己的沙箱中的这些文件。
问题是,除非我将主应用程序(打开电源盒)设置为具有文件读写访问权限,否则即使其权利文件指定文件读写访问权限,需要写访问权限的 XPC 服务也不会获得它。控制台中记录了以下内容:
deny file-write-unlink <file path>
解决此问题的唯一方法是为打开 powerbox 文件的主应用程序提供读写权限,或者重新设计 UI 流程以便需要写入权限的进程显示 powerbox?最终目标是让每个进程拥有尽可能少的权限。理想的权利是在主 .app 进程中没有文件访问权限,两个 XPC 服务具有文件只读和一个 XPC 服务文件读写。谢谢!
编辑:
与用户交互以扩展沙盒的 OS X 安全技术称为 Powerbox。Powerbox 没有 API。当您使用 NSOpenPanel 和 NSSavePanel 类时,您的应用程序会透明地使用 Powerbox。