所有的答案正确地为我工作,但我发现,适合更好的另一种解决方案我的需求。 我需要从一个命令行工具,我用下面的行实现推出Cocoa程序:
system("nohup /PATH/Arguments.app/Contents/MacOS/Arguments argument1 argument2 &");
nohup的是UNIX服务,它可以让你的过程,所以如果你关闭终端窗口重视自身,这个过程依然存在。
出现的下一个问题是从Cocoa应用程序中捕获参数。 “如果main.m
是接收它们并只返回一个int,我将如何获得AppDelegate.m
的参数。”
在Apple的框架和库中,我找到了一个完全解决问题的方法。这个库被称为crt_externs.h,它包含两个有用的变量,一个用于了解参数的数量,另一个用于获取参数本身。
extern char ***_NSGetArgv(void);
extern int *_NSGetArgc(void);
所以,里面的AppDelegate中的从可可应用程序,我们会写下面的代码的参数解析成的NSString的:
char **argv = *_NSGetArgv();
NSString *argument1 = [NSString stringWithCString:argv[1] encoding:NSUTF8StringEncoding];
NSString *argument2 = [NSString stringWithCString:argv[2] encoding:NSUTF8StringEncoding];
正如我们看到的,我们直接跳到参数阵列的位置1,因为位置0包含路径本身:
argv[0] = '/PATH/Arguments.app/Contents/MacOS/Arguments'
argv[1] = 'argument1'
argv[2] = 'argument2'
谢谢大家的时间和帮助。我从你们那里学到了很多东西。我也希望这个答案可以帮助别人:)
干杯和快乐的编码!
只有通过'NSDistributedNotificationCenter'的URL方案和通知才浮现。 – Eimantas
您展示的示例代码只是打印出java程序的命令行参数 - 这可以在任何平台上以任何语言完成。但是你的问题提到从命令行Mac程序传递参数到可可Mac程序。然而,可可只是一个编写应用程序的框架..所以目前还不清楚你真正想做什么。你在写这两个程序吗?还是你想控制现有的程序?你能给出一个更具体的例子,说明你想在OSX下做什么? –
我在一家有一些命令行工具与数据库交谈的公司工作。该命令行工具非常大,非常糟糕。在某些情况下,它只是启动了一个我能捕捉到的异常,但我似乎无法将程序设置为适当的状态。他们想要一个非常快速的修复,因此我构建了一个临时Restarter应用程序,该应用程序在命令行中通过'@ catch'语句调用,并停止命令行工具,修复数据库,然后重新启动命令行工具。从命令行工具中,我需要发送Restarter的数据库字段ID的名称来修复数据库。 –