将CLI命令添加到Cocoa应用程序?

时间:2017-03-17 09:07:32

标签: swift macos cocoa terminal

我正在寻找一种从命令行工具向正在运行的Cocoa应用程序发送命令(带参数)的方法。这可能吗?

如果我的Cocoa应用程序已打开并正在运行,我希望它能够从终端接收基本事件。如何在CLI-target和Cocoa-target之间进行通信?

我找到的唯一方法是使用AppleScript并为应用添加脚本性。这是唯一的出路吗?

2 个答案:

答案 0 :(得分:1)

要从终端向您的应用发送命令,您可以使用URL Scheme。

在info.plist中注册一个方案(" yourScheme"是本例中的方案标识符),然后监听事件:

NSAppleEventManager.shared().setEventHandler(self, andSelector: #selector(handleGetURLEvent(event:withReplyEvent:)), forEventClass: AEEventClass(kInternetEventClass), andEventID: AEEventID(kAEGetURL))

并使用

获取活动的内容
@objc func handleGetURLEvent(event: NSAppleEventDescriptor!, withReplyEvent: NSAppleEventDescriptor!) {
    if let text = event.paramDescriptor(forKeyword: AEKeyword(keyDirectObject)) {
        // you may want to filter the commands here
        if text.contains("yourScheme://doStuff") {

        } else if ...
    }
}

来自终端的示例:

$ open "yourScheme://doStuff"
$ open "yourScheme://doSomethingElse"

答案 1 :(得分:0)

我最近为Mac应用商店中分发的Swift应用创建了命令行应用。我能够通过以下方式做到这一点:

  1. 使应用程序可编写脚本(请参见Implementing a Scriptable Application

  2. 生成用于编写应用脚本的库(请参见Using Scripting Bridge

  3. 使用步骤2中嵌入的库创建单独的CLI目标

我碰巧使代码开源(除了可编写脚本的应用程序之外)。脚本库称为EmporterKit,其中还包括一个Makefile来生成脚本头,CLI称为emporter-cli,它是由一个名为YDCommandKit的库构建的,这使编写CLI应用程序的方式更加容易。

此主题非常广泛,并且在与macOS上的现代安全性做法保持一致的同时,选项也受到限制。老实说,您应该尽可能地使用URL方案,但是,如果您想要功能全面的命令行应用程序,这可能是唯一的方法。