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

标签 macos sandbox

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

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

系统控制台一遍又一遍地重复以下错误约 5 分钟,然后启动:500px Uploader Helper: LSOpenFromURLSpec() returned -10827 for application 500px Uploader path (null)。

Screenshot from Console.app

帮助应用程序使用其应用程序委托(delegate)来启动主应用程序,代码如下:

- (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 中的其他应用程序。

有人知道为什么这可能不起作用或者为什么几分钟后就会开始起作用吗?

最佳答案

不确定为什么您的代码无法正常工作(这些沙箱问题仍然处于实验阶段),但对我来说这看起来像是路径问题,即 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 文件夹中,则代码可以正常工作。也许这也是您的问题。

关于macos - 沙盒 OS X 帮助程序应用程序无法打开主应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11353490/

相关文章:

wordpress - 沙箱和 Wordpress、Joomla 或 Drupal 站点?

objective-c - 进入游戏中心沙盒失败

database - 如何获得对沙盒应用程序内资源中数据库的读/写访问权限?

ios - 构建 iOS 版本时重定向 Flutter SDK 路径?

android - 无法在 mac 上识别我的 android 设备

macos - Rsync bash 脚本和硬链接(hard link)文件

cocoa - NSWindowGraphicContext?

java - 如何为 Mac/Windows 捆绑 Java 应用程序?

iphone - 关于使用沙箱与缓存进行 UITableView 异步图像下载的建议

c - 沙盒 C 的替代方案,用于限制非常有限的编程竞赛