如何在不先启动 MacOS X 应用程序的情况下将文件类型与它关联?

发布于 2024-07-10 20:19:23 字数 466 浏览 7 评论 0 原文

我想将我的 Mac OS X 应用程序的最后安装版本与某种类型的文件关联起来。 一些实验表明,info.plist 文件似乎是在启动应用程序时由操作系统读取和解释的,而不是在将应用程序包拖到磁盘时。 Apple 有关运行时的文档配置在这个主题上没有说太多。

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

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

I would like to associate the last installed version of my Mac OS X application with a certain type of file. A little experimentation shows that the info.plist file seems to be read and interpreted by the operating system when launching the application, not when dragging the application bundle to the disk. Apple's documentation on run-time configuration does not say much on that topic.

Is there any way, using a simple .dmg image as installation medium, to make sure the system associates that particular file type with my newly installed app without having to launch it first?

I should clarify that I want this to be done automatically during the installation (I don't want my users to have to do it themselves).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

泅人 2024-07-17 20:19:23

当用户将应用程序拖到应用程序文件夹中时,系统应自动将其注册到启动服务中。 请参阅应用程序注册

When a user drags an application into the Applications folder, the system should register it with Launch Services automatically. See Application Registration in the Launch Services Guide.

我不咬妳我踢妳 2024-07-17 20:19:23

尽管托尼的信息是正确的 - 也在此处进行了解释 - (将 MyApp.app 拖到< code>Applications 将使用 Info.plist xml 文件和设置文件关联中的信息自动注册启动服务),它并不能完全回答有关文件关联的问题。

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

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

与其他平台相比,Mac 上的文件关联有点不同。 大多数平台,当 *.foo 注册到 myapp 时,当双击 MyFile.foo 时,它会按照以下方式分派一些内容:

/path/to/myapp MyFile.foo

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

在这里提问和回答:

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

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

  • 108 页 PDF 位于此处(警告,这被标记为“遗留”,可能会发生链接腐烂)。
  • 苹果开发者门户的相关文档可在此处
  • Qt 的方法记录在此处

来自 qt.io:

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

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

Qt 3 没有提供处理 Apple 事件的抽象,但使用 Mac 的 Carbon API 在应用程序中添加对它们的支持非常简单。 假设我们有一个名为 XpmViewer 的应用程序,它显示 XPM 文件(X11 图像格式)。 主窗口类声明如下:[代码片段已删除]

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

在 C++ main() 执行之前处理 Mac OS X 文件打开事件
启动时未调用 AEInstallEventHandler 处理程序

Although Tony's information is correct -- also explained here -- (that dragging the MyApp.app to Applications will register with Launch Services automatically using information from Info.plist xml file and setup file associations), it doesn't fully answer the question about file association.

If people follow these instructions, they'll have their application open, but no specific file opened.

[...] make sure the system associates that particular file type with my newly installed app

File association is a bit different on Mac as when compared to other platforms. Most platforms, when *.foo is registered with myapp, when MyFile.foo is double-clicked, it dispatches something along the lines of:

/path/to/myapp MyFile.foo

And although you're free to use this technique on command line on a Mac with success, it simply won't work through Finder and also won't work through double-clicking the associated file on the desktop.

Asked and answered here:

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

Some claim is this approach is advantageous over conservative document-open-file-handling in main() because it "only opens one instance of the application". Regardless of the reasoning behind this decision, it further complicates matters from a C++ perspective.

  • The 108 page PDF available here (warning, this is marked as "legacy", linkrot may occur).
  • Relevant documentation from apple's developer portal available here.
  • Qt's approach is documented here.

From qt.io:

When a user double clicks on a file in the Finder, Finder sends an Apple event to the application associated with the file and asks it to open the file. If the application is not running, it is launched and then the request is made. The advantage of this approach is that there is only one instance of the application running.

On Windows, this usually is done by launching the application and passing the name of the file as a command line argument. Looking at many files results in launching many instances of the same application. (The QtSingleApplication component, available as a Qt Solution, addresses this issue.)

Qt 3 does not provide an abstraction for handling Apple events, but it is straightforward to add support for them in your application using Mac's Carbon API. Let's assume we have an application called XpmViewer that displays XPM files (an X11 image format). The main window class declaration follows: [code snippet 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

怪我鬧 2024-07-17 20:19:23

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

You can do that by typing apple-I on the file you want to associate the application with, use the little box called "Open with..." and select your app. You can check the little box below "Change All..." to make the change for all similar files.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文