Xcode 如何将沙盒应用程序添加到登录项目

Xcode 如何将沙盒应用程序添加到登录项目,xcode,macos,cocoa,sandbox,Xcode,Macos,Cocoa,Sandbox,如果用户选择该选项,我希望我的应用程序自动启动。沙盒应用程序中不再允许使用我一直使用的方法 我知道我必须创建一个助手来实现这一点?有没有一个简单的教程和示例代码来激活它 我找到了本教程,但它不适用于我: 这是一件非常标准的事情,我不明白为什么没有可用的示例项目 更新: 我上传了一个示例项目:您可以尝试使用服务管理框架 正如从……中引用的那样 要为沙盒应用程序创建登录项,请使用SMLoginItemSetEnabled功能(在ServiceManagement/SMLoginItem.h中声明)

如果用户选择该选项,我希望我的应用程序自动启动。沙盒应用程序中不再允许使用我一直使用的方法

我知道我必须创建一个助手来实现这一点?有没有一个简单的教程和示例代码来激活它

我找到了本教程,但它不适用于我:

这是一件非常标准的事情,我不明白为什么没有可用的示例项目

更新:


我上传了一个示例项目:

您可以尝试使用
服务管理框架

正如从……中引用的那样

要为沙盒应用程序创建登录项,请使用
SMLoginItemSetEnabled
功能(在
ServiceManagement/SMLoginItem.h
中声明),如
使用守护进程中的服务管理框架添加登录项和
服务编程指南
中所述


(使用App Sandbox,您不能使用
LSSharedFileList.h
头文件中的函数创建登录项。例如,您不能使用函数
lsSharedFileListEnterURL
。也不能操作启动服务的状态,例如使用函数
LSRegisterURL
).

使用此(免责声明:my)示例项目,您应该会成功


更新:我现在已经测试了您上传的示例项目:它对我来说工作正常,没有任何修改,登录时启动成功。唯一的技巧是AutoStart.app文件必须放在/Applications或~/Applications文件夹中,才能在登录时成功启动。无论应用程序是否为沙盒,这都是必需的。然而,恐怕没有关于这一点的正式文件。

我刚刚重新做了大约100次试验。最后我成功了。虽然我发誓在我第一次尝试的时候它是有效的。 在我的情况下,当我将“登录时启动”切换为打开时,我只能看到助手应用程序在登录后仅启动一秒钟。然后它就不见了。 手动启动应用程序,我看到开关已关闭

以下是我的发现:

  • 我的捆绑包标识符已在
    NSArray*running=[[NSWorkspace sharedWorkspace]运行应用程序]
  • NSRunningApplication*应用程序(捆绑包名称等于我的应用程序)
    的状态为:
    [app isActive]==NO
    [app ishiden]==NO
    [app isTerminated]=NO
  • 因此,我对代码进行了一些修改,如:

    BOOL alreadyRunning = NO;
    BOOL isActive = NO; // my modification
    NSArray *running = [[NSWorkspace sharedWorkspace] runningApplications];
    for (NSRunningApplication *app in running) {
    
        if ([[app bundleIdentifier] isEqualToString:@"com.mybundleidentifier"]) {
            alreadyRunning = YES;
            isActive = [app isActive]; // my modification
        }
    }
    
    if (!alreadyRunning || !isActive) { // my modification
      ....
    

    事实上我知道,但是为什么它很重要?你能提供更多关于使用本教程不起作用的信息吗?例如,是否仍在实施沙箱限制或存在其他错误消息?如果未启用沙箱,它甚至不起作用。它显示的好像一切都很好,但当我重新启动计算机时,什么也没有启动。您的解决方案的可能副本有效,我的解决方案由于某种原因无法在我的计算机上运行。非常好的教程,谢谢!本教程非常棒。但是,是否有一种方法也可以在系统首选项中将该项添加到用户的登录项中?到目前为止,它还不在那里。我知道这是可能的,因为我确实有一些来自MAS的其他应用程序能够做到这一点。你可以通过使用LSSharedFileList API中的(文档不完整的)方法来做到这一点,LSSharedFileList API是启动服务的一部分。但是,当调用API的应用程序是沙盒时,API将不起作用:执行此操作的MAS应用程序可能不会被沙盒。这些要求在:@Tim-您的教程适用于几乎所有类型的应用程序,但并非所有应用程序,可能是由于iOS错误。我正在创建一个应用程序,它只是一个菜单栏应用程序,没有窗口。因此,我必须将
    应用程序is Agent
    设置为YES,以去除其停靠图标。这将阻止助手启动主应用程序。如果我将
    应用程序是代理
    设置为否,则您的教程有效。我的系统信息:Mac OS X 10.8.2,XCODE 4.6您可能需要添加
    中断紧接着
    isActive=[app…