macos - cocoa : Bring an application to front launched from NPAPI Plugin

标签 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 会提示一个对话框“是从互联网下载的应用程序。您确定要打开它吗”。

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

找不到解决该问题的解决方案。我可以接受 NSWorkspace 的确认对话框,但任何人都可以建议一些在单击“确定”后仍会将应用程序置于前面的建议。

我也尝试过使用。

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

如有任何帮助,我们将不胜感激。提前致谢。

问候,

LazyCoder7。

最佳答案

如果您想绕过该对话框,从而避免它造成的焦点问题,您可以在启动应用程序之前使用 xattr 手动去除隔离标志。

(这个问题实际上与 NPAPI 无关;您在独立应用程序中执行此操作时会具有完全相同的一组行为。)

关于macos - cocoa : Bring an application to front launched from NPAPI Plugin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14978266/

相关文章:

ios - NSDateFormatter 不同日期的相同字符串

python - 构建一个 python 鸡蛋,第一个字母被错误地从根文件/文件夹名中删除

ios - Xcode - 如何修复 'NSUnknownKeyException',原因 : … this class is not key value coding-compliant for the key X"error?

objective-c - Mac App Storyboard - 在 NSViewController 中访问文档

objective-c - Objective-C继承中@synthesize/@property的使用

swift - NSTask (whoami) 到字符串,到 NSTask (cp) 失败 - Swift

objective-c - 如何通过NSTask运行 "Purge"命令?

macos - El Capitan 无法通过 LAN 中的外部设备连接到 Localhost 服务器

iphone - NSMutableArrays 的 NSMutableArray。发送到不可变对象(immutable对象)的变异方法

cocoa - 在 rsync NSTask 方法中包装排除选项