我是在这里遇到错字还是在 iOS 上确实存在两种变体:
UTImportedTypeDeclarations
UTExportedTypeDeclarations
两者都在 Google 上返回了一些结果,但后者返回的点击数是后者的两倍。这些 plist 键是做什么用的?CFBundleDocumentTypes
我认为其他两个似乎已经做了什么,即允许应用程序打开特定文件类型有什么区别?
您可以使用自己的 UTIUTExportedTypeDeclarations
来定义您的应用程序想要教授它所安装的系统的 UTI。UTI 描述了一段数据(不一定是位于文件内的数据!),并且至少需要一个标识符 ( )。此外,它可能有一个名称 ( )、一个或多个文件扩展名 ( )、一个或多个 MIME 类型 (com.example.MyCoolDataType
My Cool Data Type
.myCoolDataType
x-application/my-cool-data-type
)、一种或多种粘贴板类型(在使用复制和粘贴传输此类数据时使用)和一种或多种旧操作系统类型(四个字符代码,OS X 不再使用,这是 MacOS 9 和更早版本的类型系统) . 通常,您还希望 UTI 符合现有的 UTI,这样不知道您的 UTI 但确实知道它符合的 UTI 之一的应用程序仍然能够对其执行有意义的操作。例如,当您说您的 UTI 符合 时public.data
,任何可以处理通用数据的过程也可以处理您的 UTI,因为您的 UTI 描述了通用数据。
系统有一个包含所有已知 UTI 的数据库,当您的应用程序定义新的 UTI 时,它们会自动添加到数据库中,因此整个系统都知道。请注意,您的应用定义了这些 UTI 并不意味着它也可以“处理”包含此类数据的文件!
典型使用示例:
您定义了自己的专有文件数据格式,并希望其他应用程序、插件、扩展程序等也知道这种数据格式。
您使用UTImportedTypeDeclarations
确实教系统有关您希望在系统中知道但不是您的 UTI 的 UTI。这些值与 for 相同,UTExportedTypeDeclarations
并且所有类型也添加到数据库中,因此在整个系统中都是可见的。
UTExportedTypeDeclarations
和之间的区别UTImportedTypeDeclarations
仅在于您声明对 中的 UTI 的所有权UTExportedTypeDeclarations
,这意味着如果系统已经知道 UTI 但存储的值与您的值不同,则您的值会更新存储的值,因为它是您的 UTI,所以您的描述一直被认为是权威!在 的情况下UTImportedTypeDeclarations
,甚至不会考虑系统已知的类型,因为您所说的不是权威的。这些仅考虑到目前未知的类型,并且一旦任何应用程序在 下列出相同的 UTI UTExportedTypeDeclarations
,该应用程序的值就会覆盖您的应用程序给出的值。
典型使用示例:
您的应用程序能够读取另一个应用程序的专有数据格式,但您甚至不知道该应用程序是否安装在系统上。为了使该数据格式为人所知,您将其声明为导入,因为一旦用户安装了相关应用程序,您就希望该应用程序为您正确定义数据格式。
您CFBundleDocumentTypes
用来告诉系统您的应用程序可以打开哪些文档类型。除非您在此处还列出了您的 UTI,否则这些 UTI 不会与您在 Finder 中的应用相关联,并且您的应用不会出现在Open With >
菜单。如果您将所有文件类型定义为 UTI,那么您需要为每种文档类型提供 UTI 和角色。如果没有被文档类型覆盖,名称、图标、文件扩展名或 MIME 类型等内容都将从 UTI 中获取。但是请注意,您可以在不定义 UTI 的情况下定义文档类型,在这种情况下,您必须直接在文档类型上设置所有这些值。您必须始终为文档类型设置的唯一内容是角色。角色可以是“查看者”(您可以显示该文件类型但不能编辑它)、“编辑者”(您可以显示和编辑该文件类型)、“无”(未指定您可以使用该文件做什么) .
典型使用示例:
您希望您的应用确实与某些文件类型相关联,这些文件类型可以通过扩展名、MIME 类型或 UTI 标识符来标识。如果您希望您的应用程序与 UTI 类型相关联,则应用程序应导入或导出该类型,否则系统可能不知道该类型,并且注册到未知的 UTI 类型根本没有任何效果。
UTExportedTypeDeclarations
如果您的应用程序定义了新的 UTI,您可以使用。这会告诉系统您自己的自定义 UTI。
如果您UTImportedTypeDeclarations
的应用程序使用由其他人创建但未由系统定义的 UTI,则您使用。