可可:从NPAPI插件启动前面的应用程序

时间:2013-02-20 11:04:20

标签: macos cocoa nstask nsworkspace

我有一个MAC的NPAPI插件,用于从服务器下载并运行应用程序。

当我使用NSTask打开应用程序时。该应用程序没有出现在前面。

NSBundle *bundle = [NSBundle bundleWithPath:AppPath];
NSString *path = [bundle executablePath];
NSTask *task = [[NSTask alloc] init];
NSArray *arguments;
arguments = [NSArray arrayWithObjects:AppParam,nil];

[task setLaunchPath:path];
[task setArguments:arguments];
[task launch];

我搜索了解决方案并提出了代码

int pid  = [task processIdentifier];
ProcessSerialNumber psn;
GetProcessForPID(pid, &psn);
SetFrontProcess(&psn);

但是这段代码没有把应用程序带到前面然后我尝试了下面的代码。

NSRunningApplication *runapp = [NSRunningApplication runningApplicationWithProcessIdentifier:pid];
[runapp activateWithOptions:0];

这没有产生预期的结果。

经过一些搜索后,我遇到了一些建议使用NSWorkspace启动和激活应用程序的帖子。我提出了代码。

[workspace
    launchApplicationAtURL:[bundle bundleURL]
    options:NSWorkspaceLaunchNewInstance
    configuration:[NSDictionary
        dictionaryWithObject:arguments
        forKey:NSWorkspaceLaunchConfigurationArguments]
    error:error];

这一切都行,但不是在一种情况下。当应用程序下载并由NSworkspace命令首次执行时,MAC会提示对话框“是从Internet下载的应用程序。确定要打开它”。

如果按下确定,应用程序确实启动但不会出现。 仅当通过NSWorkspace启动应用程序时,才会显示此对话框。使用NSTask启动时,MAC在执行之前不会提示对话框。

找不到可以解决问题的解决方案。我可以使用NSWorkspace的确认对话框,但是任何人都可以建议在单击“确定”后仍然可以将应用程序带到前面。

我也尝试过使用。

[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
[[NSWorkspace sharedWorkspace] activeApplication];

任何帮助都将不胜感激。提前谢谢。

此致

LazyCoder7。

2 个答案:

答案 0 :(得分:2)

如果您想绕过对话框,可以在启动应用程序之前用xattr手动剥离隔离区标记,从而避免产生焦点问题。

(这个问题与NPAPI无关;你从一个独立的应用程序中完成同样的行为。)

答案 1 :(得分:0)

您可能不应该绕过隔离标志。 这样做的需要通常表明设计不好。

NSWorkspace将以用户级权限运行。 NSTask可以设置其环境,即使它默认为父进程的环境。