我想将上次安装的 Mac OS X 应用程序版本与某种类型的文件相关联。一个小实验表明info.plist文件似乎在启动应用程序时被操作系统读取和解释,而不是在将应用程序包拖到磁盘时。Apple 关于运行时配置的文档并没有对此主题进行太多说明。
有什么方法可以使用简单的.dmg
映像作为安装介质来确保系统将该特定文件类型与我新安装的应用程序相关联,而无需先启动它?
我应该澄清一下,我希望在安装过程中自动完成(我不希望我的用户必须自己做)。
我想将上次安装的 Mac OS X 应用程序版本与某种类型的文件相关联。一个小实验表明info.plist文件似乎在启动应用程序时被操作系统读取和解释,而不是在将应用程序包拖到磁盘时。Apple 关于运行时配置的文档并没有对此主题进行太多说明。
有什么方法可以使用简单的.dmg
映像作为安装介质来确保系统将该特定文件类型与我新安装的应用程序相关联,而无需先启动它?
我应该澄清一下,我希望在安装过程中自动完成(我不希望我的用户必须自己做)。
当用户将应用程序拖入 Applications 文件夹时,系统应自动将其注册到 Launch Services。请参阅启动服务指南中的应用程序注册。
尽管 Tony 的信息是正确的——这里也有解释——(拖动MyApp.app
toApplications
将使用来自 xml 文件和设置文件关联的信息自动注册到 Launch Services Info.plist
),但它并没有完全回答有关文件关联的问题。
如果人们遵循这些说明,他们将打开他们的应用程序,但不会打开特定文件。
[...] 确保系统将该特定文件类型与我新安装的应用程序相关联
与其他平台相比,Mac 上的文件关联略有不同。大多数平台,当*.foo
用 注册时myapp
,当MyFile.foo
被双击时,它会按照以下方式调度一些东西:
/path/to/myapp MyFile.foo
尽管您可以在 Mac 上的命令行上成功使用此技术,但它根本无法通过 Finder 工作,也无法通过双击桌面上的关联文件来工作。
在这里问和回答:
https://stackoverflow.com/a/19702342/3196753
有人声称这种方法优于保守的文档打开文件处理,main()
因为它“只打开应用程序的一个实例”。不管这个决定背后的原因是什么,从 C++ 的角度来看,它使事情变得更加复杂。
来自 qt.io:
当用户在 Finder 中双击文件时,Finder 会向与该文件关联的应用程序发送一个 Apple 事件并要求它打开该文件。如果应用程序未运行,则启动它,然后发出请求。这种方法的优点是只有一个应用程序实例在运行。
在 Windows 上,这通常通过启动应用程序并将文件名作为命令行参数传递来完成。查看许多文件会导致启动同一应用程序的许多实例。(作为 Qt 解决方案提供的 QtSingleApplication 组件解决了这个问题。)
Qt 3 没有提供处理 Apple 事件的抽象,但使用 Mac 的 Carbon API 在应用程序中添加对它们的支持很简单。假设我们有一个名为 XpmViewer 的应用程序,它显示 XPM 文件(一种 X11 图像格式)。主窗口类声明如下:[删除代码片段]
(BOOL)application:(NSApplication *)theApplication
openFile:(NSString *)filename
在 C++ main() 执行 AEInstallEventHandler 处理程序在启动时未调用之前处理 Mac OS X 文件打开事件
您可以通过在要关联应用程序的文件上键入 apple-I 来做到这一点,使用名为“打开方式...”的小框并选择您的应用程序。您可以选中“全部更改...”下方的小框以对所有类似文件进行更改。