首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MacOs“打开APP.app”和"APP.app/content/MacOs/APP“外壳脚本之间的差异

MacOs“打开APP.app”和"APP.app/content/MacOs/APP“外壳脚本之间的差异
EN

Stack Overflow用户
提问于 2017-04-26 12:57:22
回答 1查看 1.1K关注 0票数 2

不知何故,如果我调用一个应用程序两次或几次,但应该只运行一个实例(这是需要的),我就会遇到问题。

首先,一些(可能是必要的)背景资料:

  • 在MAC OS X El Capitan上工作(10.11.6)
  • 我有一个由node.js制作的应用程序,它是由"npm -m“制作的(让我们称之为APP.app)
  • 通过打开构建的dmg-文件并将其移动到程序文件夹中,我将应用程序App.app安装到程序文件夹中。
  • 然后单击程序文件夹中的App.app图标启动应用程序App.app
  • 应用程序从一个可见窗口开始,并有一个隐藏的后台进程正在运行。
  • 如果关闭可见窗口,App.app-Icon将保留在码头上(这是好的,因为后台进程仍在运行)
  • 现在(这是windows构建和运行窗口的区别),如果我再次单击程序文件夹中的App.app-图标,我只会关注已经在运行的应用程序,而不是打开窗口和关闭旧的应用程序(我可以看到屏幕上方的apple-徽标旁边的开关菜单名称,它变成了"App")。
  • 前一个运行实例的关闭在init方法中以电子代码定义,如下所示: var shouldQuit = app.makeSingleInstance(function (commandLine,workingDirectory) ){console.info(‘启动新实例’);initInternal(commandLine);//有人试图运行第二个实例,我们应该聚焦我们的窗口。var windows = options.closeWindowsOnRestart?Browser.getAllWindows():appWindows.slice();windows.forEach(函数(val,索引){ val.close();};readyCallback();})

因此,我做了一些家庭作业,可以看出以下几点:

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

,我在想为什么?有什么线索吗?应用程序的开放调用和直接调用之间有什么区别?

我建议App.app包中的info.pklist使公开呼叫不同于直接调用App.app。

顺便说一句:不幸的是,我已经尝试添加了尝试捕获块来调试问题,但是open没有给终端提供输出,它只是打开了调用,而直接调用没有抛出错误,而且一切正常。不管怎样,我认为与其说是App.app问题,不如说是MAC OS X问题。

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

如果需要的话,不要犹豫要求更多的细节。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-05 11:34:01

简写版:

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

*长版本*

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

因此,我阅读了LaunchService-文档,并发现如下:

“通过文件系统引用打开项目.默认方式:如果指定项是应用程序:.如果应用程序已在运行,则激活它(将其带到屏幕前面)并发送一个'rapp‘(”重新打开应用程序“) Apple事件。”

(资料来源:ref/doc/uid/TP30000999-CH203-TP9)

这正好反映了我的观察,如果我第二次点击图标,应用程序只是聚焦/激活。

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

通过进一步阅读,我得到以下信息:

“在打开应用程序时(单独或打开一个或多个文档或URL),您可以指定各种启动选项,以控制其启动或激活的方式。这些选项可以包括:是否启动应用程序的新实例,即使另一个实例已经在运行”

(资料来源:ref/doc/uid/TP30000999-CH202-BABBJHID)

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43634913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档