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

时间:2014-10-29 16:00:42

标签: cocoa appstore-sandbox

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

这是我的帮助应用程序代码(在其app委托中):

- (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!");
    }

}

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

2 个答案:

答案 0 :(得分:2)

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

  

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

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

答案 1 :(得分:2)

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

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