沙盒应用程序,无需用户交互即可保存文件的位置

El *_*ato 3 macos sandbox objective-c osx-mountain-lion

我对应用程序应该在哪里发送一堆文件感到有些困惑。让我假设一个应用程序一次从用户那里接受一些带有NSOpenPanel的图像。应用程序对它们应用图形过滤器。现在可以保存处理过的文件了。在他们强迫我们沙箱应用程序之前,我们被允许在没有NSSavePanel 的情况下将处理过的文件导出到应用程序支持中的应用程序文件夹. 如果你想在别处保存文件,那么你必须使用 NSSavePanel。如果应用程序被沙盒化,它无法将文件发送到 NSApplicationSupportDirectory/{app name}(指向分配给该应用程序的容器文件夹)?几天前,我的第一个沙盒应用程序被拒绝,仅仅是因为文本字段显示了容器应用程序支持文件夹的路径。所以如果你有一堆文件要导出,你必须提示用户询问每个文件的保存位置? Apple, Inc. 发布的AppSandboxDesignedGuide没有具体说明文件的保存位置,只是说“您的应用程序对容器及其子目录具有不受限制的读/写访问权限”。我认为本 PDF 指南是本网站的印刷版. 我在这里问这个问题是因为我有一些疑问,至少在我两年前向他们提交申请时,审稿人经常是错误的。

感谢您的意见。

CRD*_*CRD 5

如果文件仅供应用程序本身使用,您可以将文件保存在“Application Support/”中,沙箱下位于您的容器下,就像以前一样 - 只需使用 API 构建该文件夹的路径(并创建它,它不会像以前一样自动存在)。

如果您要输出文件供用户访问,则不要将它们放入容器中 - 该文件夹旨在对普通用户隐藏,尽管您是我第一次听说即使显示路径也能让您获得拒绝,但苹果是相当随机的。

以下是放置文件位置的三种选择:

首先是询问用户。无论如何,这就是您通常会做的事情,您不应该只是在某处转储文件。

第二种情况是沙箱变得更难 - 当文件应该在何处是隐式的时,例如图形转换程序可能会明智地在与原始文件夹相同的文件夹中输出具有相同名称但不同扩展名的转换文件。Apple 终于在 10.8.3 或“相关项目”中解决了这个问题 - Apple 的文档在这里。本质上,在 Info.plist 的文档类型中,您必须列出您处理的所有扩展 - 输入和输出 - 并添加一个NSIsRelatedItemType值为 的键,YES您可能会在它们之间进行转换。例如,对于 TextEdit .rtf、.rtfd 和 .txt 以这种方式标记,因此 TextEdit 可以作为一种格式打开并另存为另一种格式。

第三,如果您希望将所有文件放在一个位置,请说在“已转换的项目”文件夹中。然后您要求用户一次指定此文件夹,然后将安全范围的书签保存到您的应用程序默认值或应用程序容器中的其他位置的该文件夹中。在后续执行中,您可以访问此书签并重新获得对该文件夹的访问权限。要对此进行介绍,请从 Apple 的安全范围书签和持久资源访问开始。这真的不比 pre-sandbox 难,因为任何像样的应用程序总是会向用户询问文件夹的位置,不同之处在于需要保存安全范围的书签,因此用户不需要每次都授予权限.

哈。