22

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

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

我找到了本教程,但它对我不起作用:http: //www.delitestudio.com/2011/10/25/start-dockless-apps-at-login-with-app-sandbox-enabled/

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

更新:

我上传了一个示例项目:http ://ge.tt/6DntY4K/v/0?c

4

3 回答 3

21

您应该通过使用这个(免责声明:我的)教程取得成功,包括示例项目。

更新:我现在已经测试了您上传的示例项目:它对我来说工作得很好,没有任何修改,并且在登录时启动成功。唯一的技巧是 AutoStart.app 文件必须放在 /Applications 或 ~/Applications 文件夹中才能在登录时成功启动。无论应用程序是否被沙盒化,这都是必要的。但是,恐怕没有关于此的官方文档。

于 2012-07-05T20:52:48.490 回答
11

我刚刚在Tim 的教程上重新做了大约 100 次试用。最后我让它工作了。虽然我发誓它在我第一次尝试时有效。在我的情况下,当我将“登录时启动”切换为开时,我只能在登录后看到帮助应用程序启动一秒钟。然后它就消失了。手动启动应用程序,我看到开关已关闭。

这是我发现的:

  1. 我的包标识符已经在列表中 NSArray *running = [[NSWorkspace sharedWorkspace] runningApplications]
  2. 的状态NSRunningApplication *app (bundle name equal to my app)是: [app isActive] == NO, [app isHidden] == 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
  ....
于 2013-02-07T09:19:40.577 回答
1

您可以尝试使用Service Management Framework

http://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLoginItems.html#//apple_ref/doc/uid/10000172i-SW5-SW1

http://developer.apple.com/library/mac/#documentation/Security/Conceptual/AppSandboxDesignGuide/DesigningYourSandbox/DesigningYourSandbox.html引用...

要为您的沙盒应用程序创建登录项,请使用守护程序和中所述的SMLoginItemSetEnabled函数(在 中声明ServiceManagement/SMLoginItem.h)。Adding Login Items Using the Service Management FrameworkServices Programming Guide

(对于App Sandbox,不能使用LSSharedFileList.h头文件中的函数创建登录项,比如不能使用函数LSSharedFileListInsertItemURL,也不能操纵启动服务的状态,比如使用函数LSRegisterURL)。

于 2012-07-05T17:06:40.407 回答