Macos 单个捆绑包中的多个应用程序

Macos 单个捆绑包中的多个应用程序,macos,cocoa,macos-carbon,Macos,Cocoa,Macos Carbon,我正在开发一个多平台演示应用程序,它由两部分组成:编辑器部分和查看器部分。这两部分都作为单独的程序开发。用户使用编辑器编辑各个幻灯片,然后在用户希望查看其演示文稿时,编辑器启动查看器 在Windows上,编辑器只需执行ShellExecute()即可运行查看器。在Linux系统上,编辑器只需fork()查看器,但在Mac OS X上,由于臭名昭著的应用程序包概念,这看起来可能会变得复杂 我想知道这个问题应该如何在MacOSX上解决 是否可以在单个应用程序包中包含多个应用程序,或者是否将编辑器和查

我正在开发一个多平台演示应用程序,它由两部分组成:编辑器部分和查看器部分。这两部分都作为单独的程序开发。用户使用编辑器编辑各个幻灯片,然后在用户希望查看其演示文稿时,编辑器启动查看器

在Windows上,编辑器只需执行ShellExecute()即可运行查看器。在Linux系统上,编辑器只需fork()查看器,但在Mac OS X上,由于臭名昭著的应用程序包概念,这看起来可能会变得复杂

我想知道这个问题应该如何在MacOSX上解决

是否可以在单个应用程序包中包含多个应用程序,或者是否将编辑器和查看器组件存储为单独的应用程序包

另外,我应该如何将信息从编辑器传递到查看器应用程序?i、 e.查看者需要知道要显示哪个文件。在Windows和Linux上,我可以将其作为命令行参数传递给WinMain()或main()函数。在OS X上,LSOpenApplication()似乎可以完成这项工作,但现在已不推荐使用。我不知道LSOpenApplication()是否可以在同一个应用程序中打开应用程序,因为我不知道这是否可能

有人能解释一下这个话题吗?谢谢

是否可以在单个应用程序包中包含多个应用程序,或者是否将编辑器和查看器组件存储为单独的应用程序包

对,对

每个应用程序都必须是自己的包。但您可以自由地在包中包含包。这并不罕见。例如,看看iTunes内部:

/Applications/iTunes.app/Contents/MacOS$ ls -l
total 116816
-rwxr-xr-x  1 root  wheel  56643216 Oct 15 09:29 iTunes
-rwxr-xr-x  1 root  wheel     42608 Oct 16 20:31 iTunesASUHelper
drwxr-xr-x  3 root  wheel       102 Oct 16 20:33 iTunesHelper.app
-rw-r--r--  1 root  wheel   3617952 Oct 16 20:31 libgnsdk_dsp.3.06.0.dylib
-rw-r--r--  1 root  wheel    328928 Oct 16 20:31 libgnsdk_link.3.06.0.dylib
-rw-r--r--  1 root  wheel   3831312 Oct 16 20:31 libgnsdk_manager.3.06.0.dylib
-rw-r--r--  1 root  wheel   1511792 Oct 16 20:31 libgnsdk_musicid.3.06.0.dylib
-rw-r--r--  1 root  wheel    655328 Oct 16 20:31 libgnsdk_submit.3.06.0.dylib
查看
iTunesHelper.app
如何在
iTunes.app
中生活?还有命令行工具iTunesASUHelper?这是正常的。只需在复制文件构建阶段将其移动到那里


现在启动应用程序的常用工具是
NSWorkspace
。对于您的特定情况,您可能需要
openFile:withApplication:
。不过,您可能还想看看XPC,看看它是否能更好地满足您的需求。它允许更简单的进程间通信,尽管我发现它最好用于帮助服务,而不是完整的GUI应用。

听起来是一个糟糕的架构选择。让它成为一个应用程序。这不容易做到。首先,我想知道在一个包中是否有两个应用程序在技术上是可行的,一个运行另一个。这种架构没有任何问题,特别是如果它也可以打包为一个没有编辑器的查看器。如果做得好的话,保持两个部分分开但集成是一个很好的设计选择。我建议使用XPC,您可以在这里阅读:谢谢,这看起来是一个很好的解决方案。是否也可以将这样一个隐藏的应用程序包与某些文件扩展名相关联?i、 是否可以将“iTunesHelper.app”和Finder中的文件扩展名*.xyz关联起来?或者这只适用于顶级应用捆绑包?我这样问是因为我的查看器应用程序(存储在编辑器应用程序中)也应该可以通过双击项目文件从Finder运行……是的,这是可能的,尽管我已经做了一段时间了。我不记得Launch Services是否会在捆绑包中自动检测到它,或者您是否需要调用
LSRegisterURL()
。您可以通过运行
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister-dump
查看您的应用程序是否显示(很抱歉路径太长,但它就是这样工作的。我总是使用
查找lsregister