Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 将MacOS X菜单栏应用程序设置为在启动时启动_Cocoa_Appstore Sandbox - Fatal编程技术网

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

Cocoa 将MacOS X菜单栏应用程序设置为在启动时启动,cocoa,appstore-sandbox,Cocoa,Appstore Sandbox,我有一个沙盒菜单栏应用程序(没有停靠图标),在它的首选项窗口中,允许用户选中复选框,以便在登录时启动应用程序。我曾经使用LSSharedFileList api,但由于沙盒应用程序不再允许使用此api,因此我已迁移到使用SMLoginItemSetEnabled。我发现,尽管该应用程序将在登录时启动,但正如预期的那样,如果我返回到首选项并取消选中并重新选中登录时启动复选框,我会启动菜单栏应用程序的第二个实例 以下是我的助手应用程序代码(在其应用程序代理中): } 以下是我的首选项窗口(主应用程序

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

以下是我的助手应用程序代码(在其应用程序代理中):

}

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

}

第二个实例启动后,取消选中/重新选中复选框将不再启动其他实例。有人知道发生了什么事吗?
谢谢,我找到答案了。我看过的教程中没有提到这一点,但在SMLoginItemEnabled的文档中说:

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


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

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

我还面临一个奇怪的问题,我在登录时将helper应用程序添加到启动中,然后卸载了helper,但每次重新启动后,活动监视器仍会在列表中显示helper应用程序。

让我们希望苹果能在未来添加类似的功能。

废话!问题似乎比最初出现的要严重一些。在运行Yosemite的新MB Pro 15上,在登录时取消选中/检查启动会导致启动第二个实例,而在同样运行Yosemite的旧版2008 MB Pro 15上,不会启动第二个实例。我添加了代码来检查应用程序是否已经运行。在这两种情况下,应用程序都会在登录时启动,但较新的应用程序会显示这种奇怪的行为。任何人都有任何想法。事实上,这的确很糟糕。我也曾经有过非常好的自动启动代码。
- (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!");
    }