2

我有以下问题。我有一个带有 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 个不同的二进制文件也不是一种选择。

感谢你给与我的帮助,

4

1 回答 1

1

总是在启动时作为后台应用程序启动。然后,如果在启动时您想成为前台应用程序,您可以以编程方式更改 plist 值,然后以编程方式重新启动您的应用程序(您在终止应用程序之前发送一个 NSTask 来启动您的应用程序)。在应用程序退出时确保您处于后台模式。看起来很简单。

于 2013-01-19T15:56:47.080 回答