我有以下问题。我有一个带有 UI、nib 等的 Cocoa 应用程序。我需要能够在后台或前台启动应用程序。换句话说,我需要前者中的 NSApplicationActivationPolicyProhibited 和后者中的 NSApplicationActivationPolicyRegular 。现在......如何启动的决定取决于传递给应用程序启动的参数。所以代码看起来或多或少像:
shouldBeBackground = // read this from argument - argv
if (shouldBeBackground) {
[NSApp setActivationPolicy:NSApplicationActivationPolicyProhibited];
} else {
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
[NSApp activateIgnoringOtherApps:YES];
// later on I do the makeKeyAndOrderFront:
}
现在问题出在 Info.plist 上。如果我将 LSBackgroundOnly 设置为 1,一切都会按预期工作。但是,如果我将它设置为 0(或不设置密钥),当应用程序启动时,它会在 Dock 中显示应用程序的图标几毫秒和一点闪烁。我猜这是因为应用程序是使用默认策略初始化的(开始显示图标),而我将其切换到后台为时已晚。这也在:可可 - 以编程方式转到前台/后台
我知道在哪里读取参数并在我开始可可或应用程序之前执行上一个 IF(例如,我可以挂钩 MyOwnPrincipalClass +initialize),但即使这样(即使我设置了策略)它看起来像启动 Cocoa 将设置默认值。所以它不起作用。
我找到的唯一解决方案是将我的 IF 放在开头(在初始化可可之前),并根据参数,我编写/修改 Info.plist(LSBackgroundOnly 标志)。这可以工作,但它是一个真正的黑客。我想找到一个更清洁的解决方案。
顺便说一句,如果我反其道而行之:始终作为后台启动,然后将其设为前台会产生最差的结果,因为在进入前台时,应用程序的菜单栏不会自动显示:您需要切换到另一个应用程序并返回让它出现....我在互联网上搜索,确实它看起来像一个已知的错误/限制。
BTW2:拥有 2 个不同的二进制文件也不是一种选择。
感谢你给与我的帮助,