gpt4 book ai didi

node.js - MAC OS X "open APP.app"和 "APP.app/content/MacOs/APP"shell 脚本之间的差异

转载 作者:太空宇宙 更新时间:2023-11-04 02:07:35 26 4
gpt4 key购买 nike

如果我调用一个应用程序两次或多次,但只有一个实例应该运行(这是所需的),我就会遇到一个问题。

首先一些(可能必要的)背景信息:

  • 使用 MAC OS X El Capitan (10.11.6)
  • 我有一个由 Node.js、Electron 制作的应用程序,并通过“npm build -m”构建(我们称之为 APP.app)
  • 我通过打开构建的 dmg 文件并将其移动到程序文件夹中,将应用程序 App.app 安装到程序文件夹中
  • 然后,我通过单击程序文件夹中的 App.app 图标来启动应用程序 App.app
  • 应用程序以可见窗口启动,并且还运行一个隐藏的后台进程
  • 如果我关闭可见窗口,App.app-Icon 仍保留在扩展坞中(这没关系,因为后台进程仍在运行)
  • 现在(这是与 Windows 构建和在 Windows 中运行的区别),如果我再次单击程序文件夹中的 App.app-Icon,我只会将焦点放在已经运行的应用程序上,而不是打开窗口并关闭旧应用程序(我可以通过屏幕顶部苹果 Logo 旁边的切换菜单名称看到焦点切换/激活;它变成“App”)
  • 前一个运行实例的关闭在init-method中的 Electron 代码中定义如下:

        var shouldQuit = app.makeSingleInstance(function (commandLine, workingDirectory) {
    console.info('starting new instance');
    initInternal(commandLine);
    // Someone tried to run a second instance, we should focus our window.
    var windows = options.closeWindowsOnRestart ? Browser.getAllWindows() : appWindows.slice();
    windows.forEach(function (val, index) {
    val.close();
    });
    readyCallback();
    });

所以,我做了一些功课,可以得出以下结论:

  • 我的 App.app-icon-click 应该类似于 open/Applications/App.app
  • 这样,如果我再次调用它,我会遇到与上面描述的相同的问题(它只聚焦已经打开的窗口)
  • 现在有趣的部分来了。如果我通过直接调用 /Applications/App.app/content/MacOS/App.app 打开应用程序,旧的应用程序实例将关闭并启动新的 App.app-application
  • 我通读了 open-manual 并发现,如果我使用 -n-flag,应用程序也会成功启动一个新实例。 (打开/Applications/App.app -n)

我想知道为什么?你有什么线索吗?应用程序的打开和直接调用有什么区别?

我建议 App.app-package 中的 info.pklist 使开放调用与 App.app 的直接调用不同。

顺便说一句:不幸的是,我已经尝试添加 try-catch-blocks 来调试问题,但是 open 不会向终端提供输出,它只是打开调用,而直接调用不会抛出错误,一切正常。无论如何,我认为这更多的是 MAC OS X 问题,而不是 App.app 问题。

希望有人遇到同样的问题并为我提供解决方案

如果需要,请随时询问更多详细信息。

最佳答案

简短版本:

  • open 使用 LaunchService 启动应用程序(并且可能在 info.plist 中添加了启动参数)
  • 而直接调用应用程序只是启动应用程序本身,没有任何其他启动选项

*长版*

我通读了打开手册(man open;来源:https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/open.1.html),并且可以发现,如果您单击某个项目,“通过 LaunchServices 确定的默认应用程序将用于打开指定的文件”。

因此,我通读了 LaunchService 文档,并得出以下结论:

"Opening Items by File-System Reference [...] default way: If the designated item is an application: [...] If the application is already running, it is activated (brought to the front of the screen) and sent an 'rapp' (“reopen application”) Apple event."

(来源:https://developer.apple.com/library/content/documentation/Carbon/Conceptual/LaunchServicesConcepts/LSCTasks/LSCTasks.html#//apple_ref/doc/uid/TP30000999-CH203-TP9)

这准确地反射(reflect)了我的观察,如果我第二次单击该图标,该应用程序就会聚焦/激活。

因此,我需要能够告诉应用程序打开一个新实例(oapp-event),而不是激活已经打开的应用程序(rapp-event)

进一步阅读使我获得以下信息:

"Launch Options When opening an application (whether by itself or to open one or more documents or URLs), you can specify various launch options to control the manner in which it is launched or activated. These can include: [...] Whether to launch a new instance of the application, even if another instance is already running"

(来源:https://developer.apple.com/library/content/documentation/Carbon/Conceptual/LaunchServicesConcepts/LSCConcepts/LSCConcepts.html#//apple_ref/doc/uid/TP30000999-CH202-BABBJHID)

因此,我只需要添加“启动选项”来定义,应该创建一个新实例,而不是激活现有实例。但没有写出它的启动选项是什么以及它们将如何应用于应用程序(我建议它属于 info.plist-file)。

所以至少这是我原来问题的答案,所以我将其发布在这里。

open - 使用 Launch-Service(以及 info.plist 中定义的选项参数)启动应用程序而直接调用应用程序只是启动应用程序本身,没有任何其他启动选项

关于node.js - MAC OS X "open APP.app"和 "APP.app/content/MacOs/APP"shell 脚本之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43634913/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com