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

时间:2014-12-08 14:03:06

标签: macos cocoa macos-carbon

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

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

我想知道如何在Mac OS X上解决这个问题。

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

另外,我应该如何将信息从编辑器传递给查看器应用程序?即观众需要知道要显示的文件。在Windows和Linux上,我可以将它作为命令行参数传递给WinMain()或main()函数。在OS X上,看起来LSOpenApplication()可以完成这项工作,但现在已弃用。而且我不知道LSOpenApplication()是否可以在同一个应用程序中打开应用程序,因为我不知道这是否可能......

有人可以对这个话题有所了解吗?谢谢!

1 个答案:

答案 0 :(得分:6)

  

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

是的,是的。

每个应用程序必须是自己的捆绑包。但是您可以自由地在捆绑包中包含捆绑包。这甚至不常见。例如,查看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.appiTunes.app的生活方式?还有命令行工具iTunesASUHelper?这很好,很正常。只需在复制文件构建阶段将其移动到那里。

现在启动应用的常用工具是NSWorkspace。对于您的特定情况,您可能需要openFile:withApplication:。您可能还想查看XPC,看看它是否更符合您的需求。它允许更容易的进程间通信,但我发现它最适合帮助程序服务而不是完整的GUI应用程序。