【问题标题】:COCOA : Bring an application to front launched from NPAPI PluginCOCOA : 将应用程序置于前端,从 NPAPI 插件启动
【发布时间】:2013-02-20 11:04:20
【问题描述】:

我有一个用于 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.

【问题讨论】:

    标签: macos cocoa nstask nsworkspace


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 取决于设计。如果这是一个 NPAPI 插件,它正在从插件作者控制的服务器下载由同一组织编写的应用程序(希望它是通过 https 完成的,这样它就不会被 MiTM'd),然后让用户授权该应用程序本质上是没有意义的。在这种情况下,它们都是同一个信任网络的一部分。我同意,如果只是下载随机应用程序,那么取消隔离标志是个坏主意。但如果是随机应用,那么在没有用户干预的情况下下载和运行它们一开始就是个坏主意,所以我假设不是这样。
      • 不,它不是任何随机应用程序。它由同一作者 (ME) 为同一组织开发。所以下载的应用程序是信任网络的一部分。
      • 但是,如何确保您的插件不会被冒充为您提供下载的恶意网站劫持,而是提供其他可以自行安装的内容?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-11
      • 2019-12-15
      • 2013-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多