【问题标题】:How to associate file type with MacOS X App without launching it first?如何在不先启动 MacOS X App 的情况下将文件类型与 MacOS X App 相关联?
【发布时间】:2010-09-30 21:56:40
【问题描述】:

我想将我的 Mac OS X 应用程序的上次安装版本与某种类型的文件相关联。一个小实验表明 info.plist 文件似乎在启动应用程序时被操作系统读取和解释,而不是在将应用程序包拖到磁盘时。 Apple's documentation on run-time configuration 对此话题不多说。

有什么方法可以使用简单的.dmg 图像作为安装介质,确保系统将特定文件类型与我新安装的应用程序无需先启动相关联? p>

我应该澄清一下,我希望在安装过程中自动完成(我不希望我的用户必须自己完成)。

【问题讨论】:

    标签: macos installation file-association info.plist


    【解决方案1】:

    当用户将应用程序拖入 Applications 文件夹时,系统应自动将其注册到 Launch Services。请参阅启动服务指南中的Application Registration

    【讨论】:

    • 呃,系统不这样做,应用程序这样做。系统应该如何知道应用程序处理了哪些扩展?
    • @Tony:谢谢 Tony,我怀疑是这种行为。我的实验使我相信它并不总是按预期工作,但它可能只是我做错了什么。我将根据您指向的文档进行进一步调查。
    • @Carl:有时数据库会有点混乱。在对给定应用程序进行多次重建之后,我特别注意到这一点,它可以停止正确注册它。搜索“lsregister”以获取有关强制重建的信息。
    【解决方案2】:

    虽然 Tony 的信息是正确的——也解释了 here——(将 MyApp.app 拖到 Applications 将使用来自 Info.plist xml 文件和设置文件关联的信息自动注册到 Launch Services),但它没有'没有完全回答有关文件关联的问题。

    如果人们按照这些说明进行操作,他们的应用程序将打开,但不会打开特定文件。

    [...] 确保系统将该特定文件类型与我新安装的应用程序相关联

    与其他平台相比,Mac 上的文件关联略有不同。大多数平台,当*.foo 注册到myapp 时,当MyFile.foo 被双击时,它会按照以下方式调度:

    /path/to/myapp MyFile.foo
    

    虽然您可以在 Mac 的命令行上成功使用此技术,但它只是无法通过 Finder 工作,也无法通过双击相关文件来工作在桌面上。

    在这里提问和回答:

    https://stackoverflow.com/a/19702342/3196753

    有人声称这种方法比main() 中的保守文档打开文件处理更有优势,因为它“只打开应用程序的一个实例”。不管这个决定背后的原因是什么,从 C++ 的角度来看,它使事情变得更加复杂。

    • 108 页的 PDF 可用 here(警告,这被标记为“旧版”,可能会发生链接腐烂)。
    • 来自苹果开发者门户的相关文档here
    • Qt 的方法已记录在 here

    来自 qt.io:

    当用户在 Finder 中双击文件时,Finder 会向与该文件关联的应用程序发送一个 Apple 事件并要求它打开该文件。如果应用程序未运行,则启动它,然后发出请求。这种方法的优点是只有一个应用程序实例在运行。

    在 Windows 上,这通常通过启动应用程序并将文件名作为命令行参数传递来完成。查看许多文件会导致启动同一应用程序的许多实例。 (作为 Qt 解决方案提供的 QtSingleApplication 组件解决了这个问题。)

    Qt 3 不提供处理 Apple 事件的抽象,但使用 Mac 的 Carbon API 在您的应用程序中添加对它们的支持很简单。假设我们有一个名为 XpmViewer 的应用程序,它显示 XPM 文件(一种 X11 图像格式)。主窗口类声明如下:[code sn -p removed]

    (BOOL)application:(NSApplication *)theApplication
           openFile:(NSString *)filename
    

    Handling Mac OS X file open event BEFORE C++ main() executes AEInstallEventHandler handler not being called on startup

    【讨论】:

    • 对于那些正在寻找一种方法来专门使用 Qt 执行此操作的人,这里有一个示例拉取请求,其中包含执行此操作的机制,处理“已经运行”和“仍在启动”用例。 github.com/LMMS/lmms/pull/3219/files
    【解决方案3】:

    您可以通过在要关联应用程序的文件上键入 apple-I 来完成此操作,使用名为“打开方式...”的小框并选择您的应用程序。您可以选中“全部更改...”下方的小框以对所有类似文件进行更改。

    【讨论】:

    • 我真正想要的是在安装过程中发生这种情况:这是我的应用程序正在安装在用户的计算机上。很抱歉没有说清楚。
    • 然后查看 Tony 发布的 URL,它有答案。
    • 投反对票,因为问题询问如何实现这一目标without launching it first?
    • 呃,我没说“启动它”,只是利用信息框里,你可以选择运行哪个应用,仅此而已。
    猜你喜欢
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多