如何让 Cocoa 应用程序从终端运行一个动作,然后返回结果

Posted

技术标签:

【中文标题】如何让 Cocoa 应用程序从终端运行一个动作,然后返回结果【英文标题】:How to ask Cocoa app to run an action from the terminal and then return the result 【发布时间】:2020-01-16 13:16:32 【问题描述】:

我的 Cocoa MacOS 应用程序具有修改磁盘中某些文件的操作。 我想让这些操作可以从终端运行。

例如,如果我运行:

$ echo `myApp runAction`

这将打开应用程序,执行一些与“runAction”相关的代码,然后将结果打印到控制台。

不幸的是,由于它的局限性(不能包含动态框架),我不能只制作命令行工具。

有什么制作方法吗?

【问题讨论】:

【参考方案1】:

您应该使用 Apple Script 使您的应用程序可编写脚本。有了这个,无论它是否正在运行,你都可以在 bash(或 zsh)中对你的应用程序“说话”:

osascript -e '告诉应用“myApp”运行Action'

或通过在脚本编辑器应用程序中编写的 AppleScript 脚本。

当应用程序未运行时,它将首先启动。

网络上有一些示例/文档足以完成基本任务,例如执行命令和返回结果:

Mac Scripter link

Making A Mac App Scriptable Tutorial (raywenderlich.com) link

在我的情况下,这些文档不足以完成复杂的任务,例如将参数传递给命令,但对于简单的任务,例如:

osascript -e '告诉应用“myApp”登录'

osascript -e '告诉应用“myApp”注销'

——如果操作因某种原因失败或成功,myApp 返回文字“0”或“1”——

成功了。 osascript -e 'tell app "myApp" to quit' 甚至是免费提供的。

问候, 罗伯特

【讨论】:

谢谢罗伯特,我不知道 Apple Script。我想知道这是否是唯一的方法。 XPS 服务是否可以通过另一种方式实现? 使用 XPC,您需要编写一个命令行客户端,通过 xpc 将命令发送到您的应用程序。但是当应用程序没有运行时,客户端会失败。并且客户端必须在 PATH 中才能在 bash 中使用(或者您将客户端捆绑在应用程序包中,然后使用该二进制文件的绝对路径。总而言之,编写帮助客户端需要更多工作。只是我的 2 cts。 罗伯特,我尝试将基本脚本添加到我的应用程序中。它按预期工作,所以谢谢。困扰我的一件事是,当我第一次尝试运行脚本时,MacOS 会提示我授予“应用程序 X 控制应用程序 Y”的警报。当我单击“不允许”时,重新启用它的唯一方法是转到系统偏好设置应用程序 - 有点意思。真的没有其他办法可以做到吗? 抱歉,不,这是 macOS 的一项安全功能。一旦你允许你的脚本控制你的应用程序,你就再也不会被打扰了。 撤消您的决定(并返回对话框)的唯一方法是为所有应用程序重置此决定。我不记得有一个 cli 命令,因为我从未使用过那个。【参考方案2】:

即使您的应用程序是一个 .app 包,它的可执行文件仍然是您在命令行工具中获得的相同类型的二进制文件。

您可以在终端中执行它,传递参数,打印输出。例如

$ ./MyApplication.app/Contents/MacOS/MyApplication --some-argument

根据您的应用程序的用途,它可能不是完美的解决方案,但它是一种完全有效的使用方式。

【讨论】:

这很有趣。但是有没有办法以这种方法返回一些价值?另外,我希望命令行等到我的应用完成任务。 @msmialko 如果您要制作命令行实用程序,只需以相同的方式处理应用程序包。 IE。使用print 输出文本或使用exit 在任务完成时返回退出代码。

以上是关于如何让 Cocoa 应用程序从终端运行一个动作,然后返回结果的主要内容,如果未能解决你的问题,请参考以下文章

可可无法连接动作

命令行中的 Cocoa 应用程序

使用 xcodebuild 从命令行构建 Cocoa 应用程序后,如何运行它?

带有延迟 NSMenu 的 NSButton - Objective-C/Cocoa

《从零开始学Swift》学习笔记(Day 64)——Cocoa Touch设计模式及应用之目标与动作

Cocoa 分布式对象