【问题标题】:Can you dynamically assign CFBundleDocumentTypes to your Cocoa application?你能动态地将 CFBundleDocumentTypes 分配给你的 Cocoa 应用程序吗?
【发布时间】:2012-01-22 10:38:40
【问题描述】:
您能否将 CFBundleDocumentTypes 动态分配给您的 Cocoa 应用程序?这意味着在运行时我可以为我的应用程序分配更多的扩展来处理。
目前我为我的应用程序设置了一些扩展,以使用 Info.plist 中的 CFBundleDocumentTypes 来处理,但我想在应用程序执行时(在运行时)通过代码来执行此操作。基本上我可以在不修改 Info.plist 文件的情况下让 Launch Services 了解新的扩展。
谢谢。
【问题讨论】:
标签:
macos
cocoa
file-association
info.plist
launch-services
【解决方案1】:
目前,没有公共 API1 供应用程序在运行时动态(取消)注册文档类型到 Launch Services。
Open Emu 正面临这个问题。用户可以有选择地下载/安装模拟器,这些模拟器是 Info.plist 文件定义文档类型的捆绑包。安装模拟器后,捆绑包中定义的类型需要是 application Info.plist 中定义的类型的一部分。 Open Emu 会重写应用程序 Info.plist 以实现此目的 - 请参阅 -updateInfoPlist in OEGameDocumentController。
请注意,覆盖捆绑包 Info.plist 违反了 Mac App Store 的政策。
我们有filed radars 要求对文档类型进行运行时(取消)注册。我建议你也提交另一个文件,它应该作为#2526726 的副本关闭。即使它是重复的,重要的是无论如何都要提交它,以便 Apple 估计需要此功能的人数。
1不过,这可能是通过 SPI 实现的。当我研究这个时,我在 Launch Services 中偶然发现了_LSRegisterItemFromItemInfo()。