沙盒应用程序,在没有用户交互的情况下保存文件的位置

时间:2013-05-24 22:16:34

标签: objective-c macos osx-mountain-lion sandbox

我对应用程序应该发送一堆文件的位置感到有点困惑。让我假设一个应用程序一次从用户接受带有 NSOpenPanel 的图像。应用程序将图形过滤器应用于它们。现在它已准备好保存已处理的文件。在他们强制我们使用沙盒应用程序之前,我们可以将处理过的文件导出到Application Support中的应用程序文件夹,而不需要 NSSavePanel 。如果要将文件保存在其他位置,则必须使用NSSavePanel。如果应用程序是沙箱,则无法将文件发送到NSApplicationSupportDirectory / {app name}(指向分配给此应用程序的容器文件夹)?几天前我的第一个沙盒应用程序被拒绝仅仅是因为文本字段显示了容器应用程序支持文件夹的路径。因此,如果要导出一堆文件,则必须提示用户询问每个文件的保存位置? Apple公司发布的 AppSandboxDesignedGuide 除了说“您的应用对容器及其子目录具有不受限制的读/写访问权限<之外,没有任何关于保存文件的确切内容。 /强>“。我认为此PDF指南是this web site的印刷版本。我在这里提出这个问题是因为我有些怀疑,至少在两年前我向他们提交申请时,审稿人经常出错。

感谢您的建议。

1 个答案:

答案 0 :(得分:4)

如果这些文件仅供应用程序本身使用,您可以将文件保存在“应用程序支持/”中,该文件位于沙箱下面,与以前一样 - 只需使用API​​构建该文件夹的路径(并创建它,它不像以前那样自动存在。)

如果您要输出用户的文件进行访问,那么您不要将它们放在容器中 - 该文件夹应该对普通用户隐藏,尽管您的文件是我第一次听说即使显示路径也让你拒绝,但Apple非常随意。

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

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

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

第三,如果您希望将所有文件放在一个位置,请在“转换的项目”文件夹中。然后,您要求用户指定此文件夹,然后将安全范围的书签保存到应用程序默认值或应用程序容器中其他位置的该文件夹中。在后续执行中,您可以访问此书签并重新获得对该文件夹的访问权限。有关Apple Security-Scoped Bookmarks and Persistent Resource Access的开头介绍。这实际上并不比预沙箱更难,因为任何体面的应用程序总是要求用户提供文件夹的位置,不同之处在于需要保存安全范围的书签,因此用户不需要每次都给予权限

HTH。