Mac沙盒应用程序丢失了对其他应用程序的文件权限

时间:2012-01-12 16:14:49

标签: objective-c appstore-sandbox

我正在开发一个当前沙盒的应用。它充当基本文本编辑器。最近,我想测试当我在我的应用程序和另一个应用程序中同时打开文件时发生的情况,在一个应用程序中进行更新,然后在另一个应用程序中查看更新。我使用CodaBBEdit作为替代编辑。如果我关闭沙盒 - 那么这个问题就不存在了。但是,由于应用程序需要在3月1日之前进行沙盒处理,我宁愿实施解决方案而不是等待和观看。

当我打开这两个文件并在我的应用程序中进行编辑然后切换到另一个应用程序时,会反映更改,以便这些编辑器具有刚从我的应用程序保存的版本。但是,如果我执行与他们的应用程序保存然后移动到我的相反的方式 - 没有快乐。如果不执行任何操作,控制台会报告两个特定错误:deny file-issue-extensiondeny file-write-data。该应用程序似乎失去了编辑文档的权限,因为在我的应用程序中打开文档后,外部编辑器对其进行了更改。如果我尝试在我的应用程序中保存文件,它会要求复制文档,因为它已失去对原始文档的访问权限。这种情况不会发生相反的情况,因为这些应用程序尚未进行沙盒处理,因此我的应用程序没有权限。如果您不想要此行为,也似乎无法阻止其他应用进行更改。

developer.apple.com上的文档没有提到这种情况。我不确定这是否是预期的行为。如果是,那么我可以告诉我的用户文档权限已经丢失,他们应该保存新版本或重新打开文件。如果它不是预期的行为,那么NSDocument API中的哪个方法会在文件丢失后授予该文件的权限?我假设答案是前者,这是有意的,但任何人都可以确认并且有文件吗?

2 个答案:

答案 0 :(得分:1)

  

在不执行任何操作的情况下,控制台会报告两个特定错误:拒绝文件问题扩展和拒绝文件写入数据。该应用程序似乎失去了编辑文档的权限,因为在我的应用程序中打开文档后,外部编辑器对其进行了更改。如果我尝试在我的应用程序中保存文件,它会要求复制文档,因为它无法访问原始文档

在这种情况下的正确行为是不覆盖文件,而是提示用户是否要重新加载文档,如果是这样重新加载它然后写入。

操作系统通过不允许盲目写入已更改的文件来做正确的事。

参见NSFilePresenter - (void)presentItemDidChange以查看它是否发生了变化。重新读取该文件,然后查看是否可以保存它。你不要说你被拒绝阅读该文件。

此外,由于您尚未发布任何代码,因此显示您用于访问该文件的代码并保存它可能会有所帮助。 NSDocument内置了对沙箱中某些类型的文件更改的处理。

答案 1 :(得分:0)

让我们将您的应用程序ScottEdit和您的竞争对手称为StackEdit

可能会发生一些事情。 NSDocument有一个lockDocument方法。 StackEdit可能已锁定文档,并且在保存后未解锁。如果您退出应用程序,该文件应该已解锁并可用于您的应用程序。如果是这种情况,则需要使用kqueue或其他方法创建文件属性更改的通知。

如果其他应用是“阻止”访问您的应用。您可以向该开发人员发送电子邮件,并要求他更新他的应用程序,以便在保存后解锁文档。最后一步是设置通知,因为另一位开发人员可能会出现同样的事情(破坏你的应用程序)。