使用'启动应用程序;launchedTaskWithLaunchPath';Cocoa/objective-c API

使用'启动应用程序;launchedTaskWithLaunchPath';Cocoa/objective-c API,objective-c,cocoa,Objective C,Cocoa,我需要从应用程序启动“TextMate”,我使用了以下代码 [NSTask launchedTaskWithLaunchPath:@"/Applications/TextMate.app" arguments:[NSArray arrayWithObjects:@"hello.txt", nil]]; 但是,我得到了以下错误返回 *** NSTask: Task create for path '/Applications/TextMate.app' failed: 22, "Invalid

我需要从应用程序启动“TextMate”,我使用了以下代码

[NSTask launchedTaskWithLaunchPath:@"/Applications/TextMate.app" arguments:[NSArray arrayWithObjects:@"hello.txt", nil]];
但是,我得到了以下错误返回

*** NSTask: Task create for path '/Applications/TextMate.app' failed: 22, "Invalid argument".  Terminating temporary process.
  • 我的代码怎么了?我只是试着运行“TextMate hello.txt”
补充 我可以让它运行如下

[NSTask launchedTaskWithLaunchPath:@"/Applications/TextMate.app/Contents/MacOS/TextMate"     arguments:[NSArray arrayWithObjects:@"hello.txt", nil]];

我想看看还有多少其他方法可用。

在本例中,无效参数是应用程序的名称

如果查看有关NSTask的文档,您会发现您使用的方法基本上是低级exec()系统调用的包装器。这意味着您需要提供实际可执行文件或二进制文件的名称,以便它能够创建进程。在您的情况下,您给它一个目录(使用终端确认/Applications中的大多数应用程序包都是目录)。这就是它呕吐的原因

您可以在TextMate的bundle目录中查找实际的可执行文件(应该位于/Applications/TextMate.app/Contents/MacOS中)。然后可以修改代码以调用实际的可执行文件

但是,正确的方法似乎是使用NSWorkspace,您可以查看它的openFile:withApplication:method,它似乎可以满足您的需要,在本例中,您可以按照最初的方式将应用程序包目录指定为参数

官方文件是免费的


顺便说一下,我不能完全相信这一点;有关此主题的详细信息,请参阅。

您试图启动的是目录,而不是二进制文件

随着沙箱的出现,如果您尝试启动自己,“禁止使用沙箱reinit”,这将不再有效,并且会失败