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

pro*_*eek 3 cocoa objective-c

我需要从App启动'TextMate',并使用以下代码.

[NSTask launchedTaskWithLaunchPath:@"/Applications/TextMate.app" arguments:[NSArray arrayWithObjects:@"hello.txt", nil]];
Run Code Online (Sandbox Code Playgroud)

但是,我得到以下错误返回.

*** NSTask: Task create for path '/Applications/TextMate.app' failed: 22, "Invalid argument".  Terminating temporary process.
Run Code Online (Sandbox Code Playgroud)
  • 我的代码出了什么问题?我只是试图运行"TextMate hello.txt".

添加

我可以让它运行如下.

[NSTask launchedTaskWithLaunchPath:@"/Applications/TextMate.app/Contents/MacOS/TextMate"     arguments:[NSArray arrayWithObjects:@"hello.txt", nil]];
Run Code Online (Sandbox Code Playgroud)

我问了另一个问题,看看有多少其他方法可供选择.

Roa*_*ter 7

在这种情况下,invalid参数是应用程序的名称.

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

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

但是,似乎正确的Cocoa-ish方法是使用NSWorkspace,您可以查看其openFile:withApplication:方法,它似乎可以满足您的需要,在这种情况下,您可以指定应用程序包目录作为参数,就像你最初这样做的方式.

官方文件在这里.

顺便说一句,我不能完全赞美它; 请参阅此StackOverflow答案以了解有关此主题的更多信息.