32

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

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

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

4

2 回答 2

1

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

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

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

请参阅 NSFilePresenter - (void)presentedItemDidChange 以查看它是否已更改。重新读取文件,然后查看是否可以保存。你没有说你被拒绝读取文件。

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

于 2012-08-08T03:55:15.643 回答
0

让我们将您的 App ScottEdit 和您的竞争对手称为 StackEdit

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

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

于 2012-08-03T14:16:54.433 回答