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

3

我正在寻求一种方法,可以从命令行工具发送带参数的指令到正在运行的Cocoa应用程序。这是否可行?

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

我找到的唯一方法是使用AppleScript,并将脚本能力添加到该应用程序中。这是唯一的方法吗?


我想你可以使用“全局事件”:https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/EventOverview/MonitoringEvents/MonitoringEvents.html // 还有一种解决方案是使用URL方案,我在一个应用程序中使用它,它运行良好。 - Eric Aya
我猜NSTask是你想要查看的类。 - mangerlahn
Nstask是另一种方式。URL方案是我的问题的答案。为什么我没想到呢?@EricAya把它写成答案,我会给你信用。 :-) - jannej
@jannej 我已经写了一个答案,其中的代码可能与您最终使用的代码类似。如果您有不同的方法,请随时告诉我们。 - Eric Aya
2个回答

4

如果您想从终端发送命令到您的应用程序,可以使用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"

3

我最近为一款在Mac App Store上发布的Swift应用程序创建了一个命令行应用程序。我能够做到这一点是通过以下步骤:

  1. 使应用程序可脚本化(参见实现可脚本化应用程序

  2. 生成用于脚本化应用程序的库(参见使用Scripting Bridge

  3. 创建一个单独的CLI目标,使用从步骤2嵌入的库

我恰好将代码开源(除了制作脚本的应用程序)。脚本库名为EmporterKit,其中还包括一个Makefile用于生成脚本标题,命令行界面称为emporter-cli,它使用了一个叫做YDCommandKit的库,这使得编写CLI应用程序更加容易。
这个主题非常广泛,而在保持与macOS现代安全实践步伐一致的同时选项有限。老实说,如果可能的话,你应该坚持使用URL方案,但是如果你想要一个功能齐全的命令行应用程序,这可能是唯一的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接