首页 > 解决方案 > 让 macOS 沙盒应用程序写入由我的非沙盒应用程序创建的文件

问题描述

我有一个 macOS/Objective-C/Cocoa 应用程序。我们想要生成外部应用程序,比如 TextEdit,来编辑这个应用程序创建的文件。我通过将这些文件复制到我的 ~/Documents 目录中来创建这些文件(最终我想把它放在其他地方,但我正在尝试简化):

NSFileManager *defaultManager = [NSFileManager defaultManager];
[defaultManager copyItemAtPath:srcPath toPath:destPath error:&err];
NSDate *sourceModified = [self lastModificationOfFile:srcPath];
NSDictionary * attr = @{ NSFileModificationDate : sourceModified,
                         NSFileImmutable : [NSNumber numberWithBool:NO],
                         NSFilePosixPermissions : [NSNumber numberWithUnsignedLong:0666],
                         };
[defaultManager setAttributes:attr ofItemAtPath:destPath error:nil];

当我在 TextEdit 中打开此文件时,窗口标题显示“filename.txt - 已锁定”。编辑文档会给我“您确定要修改文档吗?” 对话。我选择“覆盖”,但随后尝试保存给我“无法保存文档“filename.txt”。您没有权限。”

但是,这会将“filename.txt.sb-a69dcdc5-7V6D2g”(或类似名称)文件写入我的 Documents 目录。并且在同一目录中使用“echo blablabla > filename.txt”从 bash shell 创建的文件可以正常打开。

我已经尝试了这些属性的许多变体。我看不出工作的文件和使用“ls -la@ filename.txt”或“xattr”显示“... - Locked”的文件之间有任何区别,甚至在同一目录中并排显示。

显然,我创建的文件存在一些沙盒问题,但我所有的搜索结果都与这个问题的另一面有关。

标签: macoscocoasandbox

解决方案


啊。我发现了这个:为什么 TextEdit 将 HTML 文件打开为已锁定。显然,由于我的 .txt 文件的内容,TextEdit 将其解释为 HTML 文档,并据此区别对待。用看起来不像 HTML 的东西替换了文件的内容,我现在可以编辑文档了。


推荐阅读