我正在转换图像大小,然后将新文件保存到原始图像文件所在的同一目录中。
我只能设置对"图像"目录的权限。如果我的应用需要选择该目录中的图像,它将按预期工作。如果我选择位于另一个目录(例如用户创建的目录文件夹)中的图像,则不会显示新图像。我在应用程序沙盒中看到的只是"用户选择的文件
"目录,"图像"目录,"下载"目录,"图片"目录,"音乐"目录和"电影"目录。有没有办法以编程方式授予此权限?
您已经对沙盒模型提出了一个长期存在的担忧;即支持将输入文档转换为同一位置的输出文档的应用程序。
Apple 解决了应用程序Info.plist
中文档类型的NSIsRelatedItemType
条目的问题子集。如果此标志存在并在多个文档类型条目中YES
,则应用程序在被授予对其中一种类型的文件的访问权限时,将有权创建任何其他类型的文件。
例如,TextEdit 为.txt
、.rtf
和.rtfd
文件类型设置了此标志,因此一旦获得对任何这些类型文件的访问权限,它就可以创建同名但任何其他类型的文件,而无需进一步的用户权限。它启用诸如"转换为纯文本"之类的命令。
从您的问题来看,您不是在这样做,而是说将"图像.png"转换为"图像调整大小.png",即更改名称而不是类型。如果没有应用程序从用户那里获得进一步的权限,则不支持这样做。
最好的解决方法是要求用户允许他们要调整大小的文件的封闭文件夹。一旦应用程序具有该文件夹,它就可以在该文件夹中执行任意数量的文件创建 - 就像您观察到的可以访问某些特殊文件夹的权利一样。
您可以遵循的一个过程是:
1 - 当需要创建输出文件时,请检查应用程序是否有权访问包含文件夹 - 您可以使用access
功能(请参阅 OS X 手册第 2 节,例如终端中的"人员访问"或在 Xcode 的文档中搜索访问权限)。
3 - (是的,我错过了 2,见下文)如果您没有访问权限,请从用户那里请求包含文件夹 - 抛出合适的NSOpenPanel
提示他们选择包含文件夹并解释原因。
4 - 授予访问权限后,请保存它 - 将安全范围的书签存储在应用程序"应用程序支持"目录中的文件中的该文件夹中。您可以在构建缓存时"修剪"缓存 - 任何文件夹的书签都消除了文件系统树中其下任何文件夹的书签的需要。这样做可以:
2 - 如果您没有访问权限,请检查已保存书签的缓存,看看您是否有该文件夹的书签,如果是,请激活它。请注意,此检查适用于文件系统树中包含文件夹或其任何父文件夹的书签。
随着时间的推移,使用此过程将累积对用户使用的文件夹的访问权限。应为用户提供一种清理缓存的方法。
它并不像听起来那么糟糕!呵呵。