3

我在 MacOS X 上,我对 app-bundle 类型的东西还很陌生。我正在编写一个打开窗口并注册鼠标输入的程序——而不是命令行工具。当我将我的代码(用 C 语言编写,如果这很重要)编译成可执行文件(“unix 可执行文件”)然后直接运行该文件(例如,通过双击它)时,会弹出一个终端窗口,并且然后程序的窗口弹出。同样,如果我导航到可执行文件的目录并从命令行打开它,它会弹出打开的 /another/ 终端窗口,然后是程序的窗口。

但是,如果我将可执行文件包装在一个包中(因此,我想将其变成一个适当的“应用程序”),那么当我通过双击或从命令行运行应用程序时,程序的窗口将打开并且没有新的终端窗口被创建。这仅仅是“应用程序包”架构的属性吗?或者有没有一种方法可以运行原始可执行文件而不会产生另一个终端窗口?我怀疑我误解了一些基本的东西。提前致谢!

4

2 回答 2

4

我相信你看到的是正确的。为了不弹出单独的窗口,您需要将其封装到一个包中。

通过双击捆绑包或使用终端中的“打开”命令启动使用 Apple 的启动服务,该服务维护已知(注册)应用程序的列表。当应用程序(bundle)被引入系统时,它会注册到 Launch Services 并与其 URI(例如 com.apple.calculator)相关联,该 URI 存在于 bundle 的 Info.plist 中

Info.plist 中的其他项目告诉启动服务如何处理应用程序,例如检查是否超过了操作系统的最低或最高版本,或者是否显示停靠项目。

一个单独的二进制文件没有关联的 Info.plist 清单,因此它的行为不能改变并且会打开一个终端窗口。

于 2015-06-08T16:09:41.593 回答
2

open裸可执行文件本质上被启动服务(Finder、Dock 和命令在您打开内容时使用的框架)视为文档。处理此类文件的应用程序是终端。因此,当您以这种方式打开可执行文件时,如果终端尚未运行,它会启动终端并告诉它打开文档。终端通过打开一个新的 shell 窗口并自动键入“文档”的路径作为命令行来执行此操作。

启动服务将捆绑的应用程序作为应用程序处理。如果应用程序已经在运行,它会激活它并可能让它打开一个新的无标题窗口。否则,它将启动它。

正如 Rob Napier 在评论中指出的那样,如果您直接从命令行运行可执行文件(或者如果某些已经运行的应用程序使用NSTask或 fork+exec 启动它),它将简单地运行。不涉及启动服务,因此不会要求终端将可执行文件作为文档打开。

于 2015-06-08T16:53:22.450 回答