【问题标题】:Sandboxed Applications, Where to Save Files Without User Interaction沙盒应用程序,无需用户交互即可在何处保存文件
【发布时间】:2013-05-20 14:39:16
【问题描述】:

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

感谢您的建议。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

    HTH。

    【讨论】:

    • 好的。非常感谢。是否使用 NSOpenPanel 提示用户为第 3 种情况指定文件夹?
    • 我猜规则已经改变了。我们能够在沙盒之前将文件发送到应用程序支持文件夹。我没有问题。我只需要在进行更改之前进行确认。
    • @TBlue - 是的,对于案例 3,打开一个对话框并为返回的 URL 保存一个安全范围的书签。 Application Support 文件夹从不用于存储用户文件,而是用于应用程序本身使用的文件。改变的是沙盒应用程序的文件夹现在从普通视图中隐藏,因此将用户文件放入其中是一个比以前更糟糕的主意。
    • 我明白了。感谢您的提示,CRD。
    • @TBlue - 打开/保存面板上总是有一个目录设置,不需要设置它,但是 if 您将它设置为 Documents(通过API)总是有意义的,或者是使用选择/保存文件的最后一个文件夹。为什么是“if”?那么系统会给它一个合理的设置,如果用户安装了“默认文件夹”之类的东西,它也会照顾它。您永远不应该将其设置为 Application Support/ (再次通过 API 找到),因为它适用于应用程序文件和用户文件。 HTH。
    猜你喜欢
    • 2019-06-11
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 2016-10-17
    • 1970-01-01
    相关资源
    最近更新 更多