我正在寻找一种从命令行工具向正在运行的Cocoa应用程序发送命令(带参数)的方法。这可能吗?
如果我的Cocoa应用程序已打开并正在运行,我希望它能够从终端接收基本事件。如何在CLI-target和Cocoa-target之间进行通信?
我找到的唯一方法是使用AppleScript并为应用添加脚本性。这是唯一的出路吗?
答案 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应用创建了命令行应用。我能够通过以下方式做到这一点:
使应用程序可编写脚本(请参见Implementing a Scriptable Application)
生成用于编写应用脚本的库(请参见Using Scripting Bridge)
使用步骤2中嵌入的库创建单独的CLI目标
我碰巧使代码开源(除了可编写脚本的应用程序之外)。脚本库称为EmporterKit,其中还包括一个Makefile
来生成脚本头,CLI称为emporter-cli,它是由一个名为YDCommandKit的库构建的,这使编写CLI应用程序的方式更加容易。
此主题非常广泛,并且在与macOS上的现代安全性做法保持一致的同时,选项也受到限制。老实说,您应该尽可能地使用URL方案,但是,如果您想要功能全面的命令行应用程序,这可能是唯一的方法。