沙盒OS X帮助应用程序无法打开主应用程序

时间:2012-07-05 22:40:28

标签: macos sandbox

我正在使用位于here的指令来创建一个嵌入式帮助应用程序,它将打开主应用程序,并将帮助应用程序注册为登录项。

帮助应用程序当前在登录时启动,但无法打开主应用程序。

系统的控制台反复重复以下错误约5分钟然后开始:500px Uploader Helper: LSOpenFromURLSpec() returned -10827 for application 500px Uploader path (null).

Screenshot from Console.app

帮助应用程序正在使用它的应用程序代理来使用以下代码启动主应用程序:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    dispatch_async(dispatch_get_main_queue(), ^{
        BOOL success = [[NSWorkspace sharedWorkspace] launchApplication:@"500px Uploader"];

        if (success)
        {
            NSLog(@"YEAHHHH");
            exit(EXIT_SUCCESS);
        }
        else
        {
            NSLog(@"NOOOOO");
            exit(EXIT_FAILURE);
        }
    });
}

根据other questions on SO,这是在沙盒环境中打开应用程序的推荐方法。

我试图将启动延迟到第一次运行循环后没有成功。同事已经证实该问题与我的开发环境无关。我也尝试使用绝对路径作为launchApplication:的参数。 launchApplication:也未能在/Applications中打开其他应用程序。

有没有人知道为什么这可能不起作用或为什么它会在几分钟后开始工作?

2 个答案:

答案 0 :(得分:2)

不确定为什么你的代码不起作用(这些沙箱问题仍然很实验),但它看起来像是路径问题,即LSOpenFromURLSpec找不到你的主应用程序。我使用以下代码从帮助应用程序启动我的主应用程序(并且它可以工作):

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Check if main app is already running; if yes, do nothing and terminate helper app
    BOOL alreadyRunning = NO;
    NSArray *running = [[NSWorkspace sharedWorkspace] runningApplications];
    for (NSRunningApplication *app in running) {
        if ([[app bundleIdentifier] isEqualToString:@"com.timschroeder.LaunchAtLoginApp"]) {
            alreadyRunning = YES;
        }
    }

    if (!alreadyRunning) {
        NSString *path = [[NSBundle mainBundle] bundlePath];
        NSArray *p = [path pathComponents];
        NSMutableArray *pathComponents = [NSMutableArray arrayWithArray:p];
        [pathComponents removeLastObject];
        [pathComponents removeLastObject];
        [pathComponents removeLastObject];
        [pathComponents addObject:@"MacOS"];
        [pathComponents addObject:@"LaunchAtLoginApp"];
        NSString *newPath = [NSString pathWithComponents:pathComponents];
        [[NSWorkspace sharedWorkspace] launchApplication:newPath];
    }
    [NSApp terminate:nil];
}

更新:我在sample project的作者上传的another question中看到了类似的问题,如果只放置了主应用,代码就可以正常运行/ Applications或〜/ Applications文件夹。也许这也是你的问题。

答案 1 :(得分:0)

我有这个问题。它是由自己从捆绑中启动帮助应用程序引起的。显然,沙盒不行吗?所以:

  1. 打开App捆绑包并单击LoginItems中的帮助应用程序始终会生成LSOpenFromURLSpec() returned -10827
  2. 注销并重新登录,我的帮助应用程序可以毫无问题地启动主应用程序。
  3. 这意味着测试帮助应用程序的唯一方法是注销并重新登录。只运行应用程序将始终失败。