通过 info.plist 中的 CFBundleDocumentTypes 覆盖 Mac 应用程序文件关联

Posted

技术标签:

【中文标题】通过 info.plist 中的 CFBundleDocumentTypes 覆盖 Mac 应用程序文件关联【英文标题】:overriding Mac app file associations via CFBundleDocumentTypes in info.plist 【发布时间】:2014-10-30 01:48:28 【问题描述】:

我开发了一个 Mac 应用程序,它可以保存和加载一种独特类型的文件。该类型在 CFBundleDocumentTypes 下的 info.plist 中正确声明,列为 LSHandlerRank: Owner 和 CFBundleTypeRole: Editor。我正在发布我的应用程序的新版本,我希望如果在他们的机器上已经有我的应用程序以前版本的用户安装了新版本但同时安装了旧版本,新版本会自动接管文件关联此类型来自旧版本的应用程序。但是默认的操作系统行为似乎是授予与文件类型关联的最早安装的应用程序作为它的永久所有者,除非用户手动更改它。我知道命令行工具duti 可以进行关联更改,并且可以编辑系统文件 com.apple.LaunchServices.plist,但这些似乎不是以编程方式进行此操作的最佳或最可靠的方法一个应用程序。是否有任何“正确”/Apple 认可的方式来做我想做的事?

【问题讨论】:

你最后找到解决办法了吗?我在这里遇到了完全相同的问题:/ 【参考方案1】:

苹果官方认可的应用程序为文件类型设置默认应用程序的方式可能是使用他们提供的LSSetDefaultRoleHandlerForContentType 函数。该函数设置存储在 LaunchServices 中的值。

Here 是关于如何在 Objective-C 和 Swift 中使用此 API 的有限官方文档。

似乎没有任何方法可以通过Info.plist 执行此操作,因为第一个应用程序被设置为用户首选应用程序。用户必须更改他们喜欢的应用程序,您可以使用上述 API 来实现这一点。

【讨论】:

以上是关于通过 info.plist 中的 CFBundleDocumentTypes 覆盖 Mac 应用程序文件关联的主要内容,如果未能解决你的问题,请参考以下文章

从 Info.plist 读取版本

错误 ITMS-90190:“Info.plist 文件中的键 'UISupportedDevices' 无效。”

CFBundle 版本

无法通过 -pathForResource 方法检索 info.plist 数据?

以编程方式更新 info.plist 中的值 [重复]

Bundle ID Suffix 是不是与 info.plist 中的 bundle 标识符相同?