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