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



我有一个沙盒菜单栏应用程序(没有停靠图标),在它的首选项窗口中,用户可以选中一个复选框,以便在登录时启动该应用程序。我曾经使用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!");
    }

}

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

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

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

因此,在允许助手启动应用程序之前,我必须检查应用程序是否已经运行。

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

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

最新更新