我有一个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。
答案 0 :(得分:2)
如果您想绕过对话框,可以在启动应用程序之前用xattr
手动剥离隔离区标记,从而避免产生焦点问题。
(这个问题与NPAPI无关;你从一个独立的应用程序中完成同样的行为。)
答案 1 :(得分:0)
您可能不应该绕过隔离标志。 这样做的需要通常表明设计不好。
NSWorkspace将以用户级权限运行。 NSTask可以设置其环境,即使它默认为父进程的环境。