我正在寻求一种方法,可以从命令行工具发送带参数的指令到正在运行的Cocoa应用程序。这是否可行?
如果我的Cocoa应用程序已经打开并在运行中,我希望它能够从终端接收基本事件。如何在CLI-target和Cocoa-target之间进行通信?
我找到的唯一方法是使用AppleScript,并将脚本能力添加到该应用程序中。这是唯一的方法吗?
我正在寻求一种方法,可以从命令行工具发送带参数的指令到正在运行的Cocoa应用程序。这是否可行?
如果我的Cocoa应用程序已经打开并在运行中,我希望它能够从终端接收基本事件。如何在CLI-target和Cocoa-target之间进行通信?
我找到的唯一方法是使用AppleScript,并将脚本能力添加到该应用程序中。这是唯一的方法吗?
如果您想从终端发送命令到您的应用程序,可以使用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"
我最近为一款在Mac App Store上发布的Swift应用程序创建了一个命令行应用程序。我能够做到这一点是通过以下步骤:
使应用程序可脚本化(参见实现可脚本化应用程序)
生成用于脚本化应用程序的库(参见使用Scripting Bridge)
创建一个单独的CLI目标,使用从步骤2嵌入的库
Makefile
用于生成脚本标题,命令行界面称为emporter-cli,它使用了一个叫做YDCommandKit的库,这使得编写CLI应用程序更加容易。