7

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

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

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

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

TextMate 2使用套接字文件。这是最好的方法吗?如果可能的话,我想使用更高级别的东西,也许NSDistributedNotificationCenter.

4

3 回答 3

2

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

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

如果您想要传输大量信息,或者想要更健壮/可预测的东西,您可能会发现套接字更可取。

于 2012-10-18T22:08:54.433 回答
2

如果您在此处查看 iTerm 源代码:

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

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

http://growl.info/

于 2012-10-25T20:30:04.230 回答
0

您可以在项目信息窗格中将 URL 方案添加到您的应用程序。

当任何地方的任何人尝试访问 urlyourscheme://info/for/your/app时,如果它没有启动,它将启动您的应用程序并传递参数。

这是您的应用程序中用于处理 url 的代码

- (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
}
于 2012-10-20T11:39:12.230 回答