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



如果我两次或几次调用应用程序,但只能运行一个实例(需要(。

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

  • 在Mac OS X El Capitan(10.11.6(上工作
  • 我已经有一个由node.js,电子和构建的应用程序,由" npm build -m"(让我们称为app.app(
  • 我通过打开构建的DMG文件并将其移动到程序文件中
  • 将应用程序应用程序App.App安装到程序文件中
  • 然后,我单击app.app-icon in Program-folder
  • 应用程序以可见的窗口开头,还具有一个隐藏的背景过程
  • 如果我关闭可见窗口,则app.app-icon保留在码头中(没关系,因为背景过程仍在运行(
  • 现在(这是Windows在Windows中的构建和运行的区别(,如果我再次单击app.app-icon在程序文件中,我只专注于已经运行的应用程序而不是打开窗口并关闭旧应用程序(我可以看到TE焦点开关/激活屏幕顶部的Apple-logo旁边的开关菜单名称;它成为"应用程序"(
  • 以下启动方法中在电子代码中定义了以下内容的关闭:

        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打开应用程序,则旧的应用程序即将关闭并进行新的应用程序。应用程序启动
  • 我可以通过open-手术阅读,并且可以弄清楚,如果我使用-n -Flag,该应用程序也会开始成功一个新实例。(open /Applications/App.app -n(

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

我建议app.app-pakeage中的info.pklist与app.app的直接调用。

不同

btw:不幸的是,我已经尝试添加try-catch-blocks来调试问题,但是open并未给终端输出输出,它只是打开呼叫,而直接呼叫则不会丢失错误,一切正常。无论如何,我相信这比App-Problem。

更是一个Mac OS X问题。

希望有人有同样的问题和解决方案

如果需要,请不要犹豫。

简短版本:

  • open使用启动服务开始应用程序(可能在info.plist中添加了启动参数(
  • 虽然直接呼叫应用程序刚刚启动应用程序,而没有任何其他启动选项

*长版 *

我通过打开手册(man open;来源:https://developer..apple.com/legacy/library/documentation/darwin/darwin/reference/manpages/manpages/man1/open.1.html(,并且可以发现"通过启动服务确定的默认应用程序用于打开指定文件",如果您单击项目。

因此,我阅读了启动服务文献,可以找出以下内容:

"通过文件系统参考打开项目[...]默认方式: 如果指定项目是一个应用程序:[...] 如果应用程序已经运行,则将其激活(带到屏幕的前面(并发送了" Rapp"("重新打开( 应用程序"(苹果活动。"

(来源:https://developer.apple.com/library/content/documentation/carbon/carceptual/launchservicesconcectsconcepts/lsctasks/lsctasks/lsctccts/lsctasks.htmll#/-/-/-/-P>

这完全反映了我的观看,如果我第二次单击图标,则该应用程序只是聚焦/激活。

因此,我需要告诉应用程序打开新实例(OAPP-EVENT(,而不是激活已经打开的应用程序(Rapp-event(

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

"打开应用程序时启动选项(无论是本身还是 打开一个或多个文档或URL(,您可以指定各种启动 控制其启动或激活方式的选项。 这些可以包括:[...]是否启动 应用程序,即使另一个实例已经在运行"

(来源:https://deverveer.com/library/content/documentation/carbon/coneptual/launchserviceconcectesconcepts/lscconpcconpcconeppects/lscconpcconpcconpecons.html#/-P>

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

至少这是我最初问题的答案,所以我在这里发布了。

打开 - 使用启动服务(以及info.plist中的定义选项参数(启动应用程序虽然该应用程序的直接调用只是启动了应用程序ISELF,而无需任何其他启动 -

相关内容