将 MacOS X 菜单栏应用程序设置为在启动时启动

Posted

技术标签:

【中文标题】将 MacOS X 菜单栏应用程序设置为在启动时启动【英文标题】:Set MacOS X menubar app to launch at startup 【发布时间】:2014-10-29 16:00:42 【问题描述】:

我有一个沙盒菜单栏应用程序(没有停靠图标),在它的首选项窗口中允许用户选中复选框以在登录时启动应用程序。我曾经使用 LSSharedFileList api,但由于沙盒应用程序不再允许这样做,我已经迁移到使用 SMLoginItemSetEnabled。我发现,虽然应用程序将在登录时启动,如预期的那样,如果我回到首选项并取消选中并重新选中登录时启动复选框,我会启动我的菜单栏应用程序的第二个实例。

这是我的辅助应用代码(在其应用委托中):

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 

    NSString * path = [[[[[[NSBundle mainBundle] bundlePath] stringByDeletingLastPathComponent]
                                    stringByDeletingLastPathComponent]
                                            stringByDeletingLastPathComponent]
                                                    stringByDeletingLastPathComponent];


    [[NSWorkspace sharedWorkspace] launchApplication:path];
    [NSApp terminate:nil];

这是我的首选项窗口(主应用程序)中的代码:

- (IBAction)toggleLoginStatus:(NSButton*)sender


    if(!SMLoginItemSetEnabled((__bridge CFStringRef)@"myAppBundleIdentifier", (BOOL)[sender state]))
            NSLog(@"Dagnabit!");
    

第二个实例启动后,取消选中/重新选中复选框不会再启动实例。有谁知道发生了什么? 谢谢

【问题讨论】:

【参考方案1】:

我找到了答案。我看过的教程都没有提到这一点,但在 SMLoginItemEnabled 的文档中这样说:

帮助应用程序的布尔启用状态。这个值是 仅对当前登录的用户有效。如果为真,助手 应用程序将立即启动(并在后续登录时) 并继续运行。如果为 false,则辅助应用程序将不再是 继续运行。

所以我必须先检查应用程序是否已经在运行,然后才能允许助手启动它。

【讨论】:

废话!似乎问题比最初出现的要深一些。在我运行 Yosemite 的新 MB Pro 15 上,取消选中/选中登录时启动会导致启动第二个实例,而在我的旧 2008 MB Pro 15 上也运行 Yosemite,不会启动第二个实例。我添加了代码来检查应用程序是否已经在运行。在这两种情况下,应用程序都会在登录时启动,但较新的应用程序会显示这种奇怪的行为。任何人都有任何想法。【参考方案2】:

我花了将近两天的时间才弄清楚这一点。最后放弃了支持登录时启动的想法。 尽管这只是前端中是或否的情况,但另一方面,开发人员必须花费大量时间(添加帮助应用程序并在两个应用程序中进行所有这些项目设置)。早期(沙盒之前)的过程比现在简单得多。 此外,当应用程序添加到“登录时启动”列表时,无法验证,因为该应用程序未列在系统首选项 -> 用户 -> 登录项中,就像沙盒之前一样。

我还面临一个奇怪的问题,我在登录时将助手应用程序添加到启动中,然后卸载了助手程序,但每次重新启动后,活动监视器仍会在列表中显示助手应用程序。 让我们希望苹果在未来添加类似LaunchAtLoginController 的内容。

【讨论】:

确实,这很糟糕。我也曾经有过非常好的自动启动代码。

以上是关于将 MacOS X 菜单栏应用程序设置为在启动时启动的主要内容,如果未能解决你的问题,请参考以下文章

充分发挥 Mac 菜单栏潜能,体验macOS系统的魅力

MacOS使用指南之我并不需要系统菜单栏

macOS必备应用Bartender,让你的 Mac 菜单栏井然有序

macOS必备应用Bartender,让你的 Mac 菜单栏井然有序

从 ViewController 设置菜单栏图标

macOS“Big Sur”检测深色菜单栏/系统托盘