如何阻止我的应用程序设置“隔离”位?

时间:2012-03-03 09:11:14

标签: objective-c macos cocoa osx-lion

自从OS X 10.7.3起,我的文本编辑器就在它接触的任何文件上设置“隔离”位。

我的文本编辑器设计用于处理shell脚本,如果设置了隔离位,则无法从命令行执行shell脚本,直到在Finder中双击它并执行“此应用程序已从互联网“提醒(或删除隔离位xattr)。

例如,我刚在我的应用程序中创建了一个“hello world”脚本,它已被隔离,无法执行:

$ xattr -l foo
com.apple.quarantine: 0006;4f51dd2f;Dux;
$ chmod +x foo
$ ./foo
-bash: ./foo: Operation not permitted

如果我删除了隔离位,则脚本可以运行:

$ xattr -d com.apple.quarantine foo
$ ./foo
hello world


根据一些论坛帖子, TextEdit 还会在它创建的任何shell脚本上设置隔离位。

我正在使用一个简单的NSDocument子类来创建文件:

- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError
{
  return [self.textStorage.string dataUsingEncoding:self.stringEncoding];
}


如何从我的应用中创建的文件中删除隔离位?其他文本编辑器(例如 TextWrangler )不会设置隔离位。

更新

更多信息,这只在创建“脚本应用程序”文件时发生,该文件是从perl脚本到html的任何内容。

只有当我的应用程序是沙箱时才会发生。禁用沙盒可以解决问题,但这不是长期解决方案。

我已经向Radar提交了一个错误,看起来似乎没什么可做的,只是等待/希望大道能够修复它。

3 个答案:

答案 0 :(得分:1)

尝试确保将Info.plist中的LSFileQuarantineEnabled设置为false(这应该是默认设置)。如果该属性仍在设置中,那么我建议您提交错误报告,并使用removexattr(2) / fremovexattr(2)

以编程方式将其删除

答案 1 :(得分:1)

很高兴知道我不是唯一一个有这个问题的人 - 这很难追踪到有关信息的问题。我发现我的程序保存的数据文件出现了这个问题(这些不是脚本,它们只是XML数据......)。

我确认LSFileQuarantineEnabled没有任何区别。

我还尝试在使用removexattr http://hints.macworld.com/article.php?story=20071029151619619编写文件后删除该属性,但这也不起作用 - 沙箱阻止了调用工作。

作为背景,我也发现了这个问题的讨论: http://reviews.cnet.com/8301-13727_7-57374676-263/workarounds-for-quarantine-bug-in-os-x-lion/

为了记录,我分别向Apple提出了一个错误。

编辑:我找到了问题的根源,并找出了解决方法。

问题在于,如果文件数据是纯XML格式数据,则MacOS会错误地显示报告的消息(我认为这是因为它错误地假定该文件是脚本)。如果我将文件格式更改为显然不是XML的替代方案,则警告消失。但是,文件仍然会在隔离位设置的情况下保存!

所以这肯定是由于MacOS中的一个问题,但有一个相对简单的解决方法 - 只需更改您的文件格式!

答案 2 :(得分:0)

据我所知,此错误已在OS X 10.8(Mountain Lion)中修复。

似乎我必须为我的应用程序制作10.8最低操作系统版本。对我来说并不是什么大不了的...但希望Apple将其修复为10.7的错误修正(10.8的系统要求比10.7高很多,我知道无法升级的人。)