命令行中的 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 应用程序项目中导出 XCode 中的 OSX 可执行文件