将 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 菜单栏应用程序设置为在启动时启动的主要内容,如果未能解决你的问题,请参考以下文章
macOS必备应用Bartender,让你的 Mac 菜单栏井然有序