命令行工具与Cocoa应用程序交互

时间:2012-10-12 05:25:47

标签: cocoa command-line appkit foundation

我有一个基于Cocoa文档的应用程序(文本编辑器),我希望能够从命令行与它进行交互。

例如,我想将其设置为在命令行上输入git / svn commit消息的编辑器。

假设我使用Foundation创建命令行工具,我的命令行工具与GUI应用程序通信的最佳方法是什么?

显然我可以使用标准的开放事件来让我的应用程序打开一个特定的文件,但是我还需要命令行应用程序等到GUI应用程序完成文档(用户关闭编辑器窗口)然后退出(类似于TextMate命令行工具中的mate -w file.txt,或其他各种mac文本编辑器中的等效文件。)

TextMate 2 uses a socket file。这是最好的方法吗?如果可能的话,我想使用更高级别的东西,也许是NSDistributedNotificationCenter

3 个答案:

答案 0 :(得分:2)

NSDistributedNotificationCenter可能会正常工作,如果这是你喜欢的抽象级别。它的接口类似于NSNotificationCenter。关于NSDistributedNotificationCenter

  • 仅限于plist类型
  • 允许删除通知
  • 这是'昂贵的'
  • 延迟可能无法预测
  • 沙盒应用无法使用userInfo:参数

如果您想传输大量信息,或者想要更强大/可预测的内容,您可能会发现插座更可取。

答案 1 :(得分:2)

如果你在这里查看iTerm源代码:

svn co https://iterm.svn.sourceforge.net/svnroot/iterm iterm

你可以看到他们是如何做到的。他们使用了Growl通知。 Growl是一个全面的通知​​框架,可以让您真正控制正在发生的事情并正确回应所有事情。您可以在此处找到有关Growl的更多信息:

http://growl.info/

答案 2 :(得分:0)

您可以在项目信息窗格中为您的应用添加网址方案。

当任何人在任何地方尝试转到网址yourscheme://info/for/your/app时,如果它未启动,它将启动您的应用并将传递参数。

以下是您的应用中用于处理网址的代码

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{

// ...

    [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(handleAppleEvent:withReplyEvent:)
                                                     forEventClass:kInternetEventClass andEventID:kAEGetURL];
}

- (void)handleAppleEvent:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent
{
    NSString *urlString = [[event paramDescriptorForKeyword:keyDirectObject] stringValue];
// .. process your url
}