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

Sco*_*ell 32 objective-c appstore-sandbox

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

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

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

del*_*ser 1

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

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

操作系统不允许盲写已更改的文件,这是正确的做法。

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

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