如果我两次或几次调用应用程序,但只能运行一个实例(需要(。
首先一些(可能是必要的(背景信息:
- 在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。
希望有人有同样的问题和解决方案
如果需要,请不要犹豫。
简短版本:
-
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,而无需任何其他启动 -