我想在没有NSOpenPanel的情况下在沙箱中复制文件

时间:2017-10-21 15:30:41

标签: objective-c macos sandbox appstore-sandbox

我想通过NSOpemPanel将一些文件复制到指定的文件夹。 源文件从XML读取并在NSTable中显示列表。

我可以通过copyItemAtPath复制文件。 但现在我的应用程序将转向沙箱,然后我无法通过copyItemAtURL复制该文件。

如何以沙箱模式复制文件?

我看过很多帖子。我认为安全范围的书签可能是一个解决方案。 但我无法创建"安全范围的书签"从路径中的XML(路径转换为NSURL就绪)。 我正在设置sandbox.entitlements但是它不清楚这个问题。

有什么办法吗?

在macOS10.12和Xcode8.3.3中开发

由于

1 个答案:

答案 0 :(得分:2)

  

如何以沙箱模式复制文件?

目前还不清楚您当前的代码在做什么,但沙箱下的规则很简单:要读取或写入位于应用程序自己的容器外部的文件(隐藏在Library文件夹下),您的应用程序必须:

  • 使用NSOpenPanel从用户获取文件路径的URL;或
  • 使用NSOpenPanel从该用户获取该文件的一个祖先文件夹的URL。

第二个选项可以访问整个文件夹,包括任何子文件夹;即以文件夹为根的整个文件/文件夹子树。

由于您要复制“某些文件”,这听起来好像要求用户对该文件夹的许可是合适的。您可以将NSOpenPanel自定义为“请求权限”对话框。如果您正在请求特定文件夹,您还可以在其包含文件夹中打开对话框,并且仅启用特定文件夹以供用户选择。

NSOpenPanel获得文件夹的URL后,您可以为其创建安全范围的书签,并将其保存在应用程序的首选项或其他配置文件中(存储在应用程序的容器中)。这样做可以让您的应用在后续执行时重新获得对该文件夹的访问权限,而无需再次询问用户。

如果在调查此问题并撰写某些代码后遇到问题,请提出一个新问题,显示您的代码并解释问题。毫无疑问,有人会帮助你完成下一步。

HTH