3

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

感谢您的意见。

4

1 回答 1

5

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

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

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

首先是询问用户。无论如何,这是您通常会做的事情,您不应该只是将文件转储到某个地方。

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

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

HTH。

于 2013-05-25T10:19:04.060 回答