我在使用MacOS X,而且我对应用程序捆绑类型的东西很新。我正在编写一个打开窗口并注册鼠标输入的程序 - 而不是命令行工具。当我将我的代码(用C编写,如果这很重要)编译成可执行文件(“unix可执行文件”)然后直接运行该文件(例如通过双击它)时,会弹出一个终端窗口,并且然后程序的窗口弹出。同样,如果我导航到可执行文件的目录并从命令行打开它,它会弹出open / another / terminal窗口,然后弹出程序窗口。
但是,如果我将可执行文件包装在一个包中(因此,我想,将它变成一个合适的“应用程序”),然后当我运行应用程序时,通过双击或从命令行,程序的窗口打开并且没有创建新的终端窗口。这仅仅是“app bundle”架构的属性吗?或者有没有办法可以运行原始可执行文件而不会产生另一个终端窗口?我怀疑我误解了一些基本的东西。提前谢谢!
答案 0 :(得分:3)
我相信你所看到的是正确的。为了使单独的窗口不弹出,您需要将其封装到一个包中。
通过双击捆绑包或使用终端中的“打开”命令启动,使用Apple的Launch Services,它维护已知(已注册)应用程序的列表。当应用程序(包)被引入系统时,它将在Launch Services中注册并与其URI(例如com.apple.calculator)相关联,该URI存在于包的Info.plist中
Info.plist中的其他项目告诉启动服务如何处理应用程序,例如检查是否已超出操作系统的最小或最大版本,或者是否显示停靠项目。
单个二进制文件没有关联的Info.plist清单,因此无法更改其行为并打开终端窗口。
答案 1 :(得分:1)
Bare可执行文件基本上被Launch Services视为文档(Finder,Dock和open
命令在打开东西时使用的框架)。处理此类文件的申请是终端。因此,当您以这种方式打开可执行文件时,如果它尚未运行则启动终端并告诉它打开文档。终端通过打开一个新的shell窗口并自动键入"文档"的路径来完成此操作。作为命令行。
Launch Services处理捆绑的应用程序,以及应用程序。如果应用程序已在运行,它会激活它并可能让它打开一个新的无标题窗口。否则,它会启动它。
正如Rob Napier在评论中指出的那样,如果您直接从命令行运行可执行文件(或者如果某些已经运行的应用程序使用NSTask
或fork + exec启动它),它将只运行。启动服务无法参与,因此不会要求终端将可执行文件作为文档打开。