命令行中的 Cocoa 应用程序

Posted

技术标签:

【中文标题】命令行中的 Cocoa 应用程序【英文标题】:Cocoa applications from the command line 【发布时间】:2011-11-15 14:04:54 【问题描述】:

按照here 的说明,我一直在尝试在不使用 NIB 或 XIB 的情况下创建 Cocoa(桌面)应用程序。一切都很好,从 Terminal.app 我可以成功运行该应用程序。然而,它生成时没有任何常见的装饰,例如菜单栏或停靠图标,终端窗口之后,并且似乎非常依赖于终端进程。

我怀疑这可能是直接从命令行运行二进制文件本身的结果,但玩了一会我发现至少Calculator.app 非常乐意在调用时生成一个“真正的”应用程序:

$ /Applications/Calculator.app/Contents/MacOS/Calculator

我在这里错过了什么,如果有的话?我也尝试过通过

加载 XIB 文件
NSNib *mainNib = [[NSNib alloc] initWithContentsOfURL:[[NSURL URLWithString:@"../MainMenu.xib"] absoluteURL]];
[NSNib instantiateNibWithOwner:application topLevelObjects:nil];

这似乎找到了 XIB,但没有区别(即 GUI 未完全加载)。

【问题讨论】:

你是在一个包中运行你的程序吗? 暂时没有——如果可以的话,我会尽量避免。我不介意有一个单独的 NIB,但理想情况下,我希望尽可能避免使用整个 .app 结构。我对 Calculator.app 的快速实验表明我所追求的可能是可能的,除非它通过某种魔法加载到它自己的包中。 【参考方案1】:

经过一番折腾,我找到了问题的解决方案。通过TransformProcessType 转换进程类型,然后使用准确命名的[NSApp activateIgnoringOtherApps:YES] 就可以了:

ProcessSerialNumber psn =  0, kCurrentProcess ; 
OSStatus returnCode = TransformProcessType(& psn, kProcessTransformToForegroundApplication);

[NSApp activateIgnoringOtherApps:YES];

(我还添加了一个自定义菜单来完成它)。感谢 Mankarse 的指点!

【讨论】:

【参考方案2】:

你需要一个 NSApplication.. 你为什么还要这样做?

如果您创建一个新的 GUI 应用程序,请查看 main.m,您会发现它正在那里生成一个 NSApplication。

int main(int argc, char *argv[])

    return NSApplicationMain(argc, (const char **)argv);

这要求您有一个捆绑包,如果您想在没有终端的情况下启动命令行实用程序,您可以使用 launchd 或创建一个捆绑包,您只需在查找器中双击即可。

【讨论】:

感谢您的回复。我确实有一个 NSApplication 对象(为清楚起见未发布代码,但它与我提到的链接基本相同)。至于我为什么这样做,是因为我需要运行的代码是跨平台的;我有兴趣创建一个跨平台部分可以绘制的窗口,我想知道如果没有所有通常的应用程序脚手架,这是否可能。 @r_。这当然是可能的(但它依赖于未记录的接口)。看看像 SFML 这样的库是如何做到的。也看看this。 osx_tell_dock hack 你可能也会感兴趣(参见here)。

以上是关于命令行中的 Cocoa 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Cocoa 应用程序中的某些行需要永远运行?

从 Cocoa 应用程序项目中导出 XCode 中的 OSX 可执行文件

命令行中的 Xcode“构建和存档”

Cocoa 应用程序中的 OpenCV(OS X 应用程序)

Swift 命令行程序中的 CFRunLoop

将 Cocoa 应用程序和命令行工具组合成一个 App Bundle