UTI,Uniform Type Identifier

文本文件可以使用文本编辑器打开,图片可以使用图片查看软件打开,这些操作都包含文件类型的判断。文件类型的表示方式很多,本文介绍的 UTI(Uniform Type Identifier)是 Apple 提出的一种表示文件类型的方法。其它的文件类型表示方法还有 OSType、文件名后缀、MIME 等。

一、UTI 的结构

UTI 为表示文件类型提供了统一的方式,它的写法采用 reverse-DNS 格式,如:com.apple.quicktime-movie、public.html、public.jpeg。

UTI 的组织结构类似于网络中域名系统的层次结构。

“public”域表示一些常见的或标准的类型。许多软件能够处理的文件类型都属于“public”域。“public”域是保留的,目前只有 Apple 能够声明该域下的类型。

“dyn”域也是保留的。某个缺少 UTI 信息并且其它类型信息(如文件名后缀、MIME)未知的文件需要获取 UTI 信息时,“dyn”域用来处理该情况。

所有其它的域允许第三方定义,比如企业定义的类型通常在“com”域下,如:com.apple.quicktime-movie。

二、UTI 的“继承”

下面两张图均来自 Apple 官方文档,UTI 的层次结构类似于面向对象编程语言中的“继承“特性。比如,某个文件的类型为“public.image”,该文件类型同样也属于“public.data”。

图 A conformance hierarchy

可以从两个角度对文件类型进行分类。物理特性:文件类型、文件夹类型等。功能特性:图片类型、视频类型等。如下图所示。

图 Physical and functional hierarchies

三、在 iOS 中使用 UTI

MobileCoreServices.framework 中定义了使用 UTI 的一些常量和方法。该框架主要包含 UTCoreTypes.h 和 UTType.h 这两个头文件。

UTCoreTypes.h 头文件中声明了系统定义的常量。如果要表示某个文件的类型,最好使用该文件中声明的常量,而不是直接使用字符串。比如 kUTTypeItem 表示 “public.item”。

UTType.h 头文件中声明了操作 UTI 的方法。一些常用方法如下。

1
2
3
4
5
6
7
8
9
10
11
// 1
Boolean UTTypeEqual(CFStringRef inUTI1, CFStringRef inUTI2) // 两个 UTI 是否相同
Boolean UTTypeConformsTo(CFStringRef inUTI, CFStringRef inConformsToUTI) // inUTI 是否“继承”自 inConformsToUTI

// 2
CFStringRef UTTypeCreatePreferredIdentifierForTag(CFStringRef inTagClass, CFStringRef inTag, CFStringRef inConformingToUTI) // 将其它的类型表示方法(如文件名后缀、MIME)转换为 UTI
CFArrayRef UTTypeCreateAllIdentifiersForTag(CFStringRef inTagClass, CFStringRef inTag, CFStringRef inConformingToUTI) // 将其它的类型表示方法(如文件名后缀、MIME)转换为 UTI

// 3. 下面两个方法为上面两个方法的逆操作,即将 UTI 转换为其它的类型表示方法
CFStringRef UTTypeCopyPreferredTagWithClass(CFStringRef inUTI, CFStringRef inTagClass)
CFArrayRef UTTypeCopyAllTagsWithClass(CFStringRef inUTI, CFStringRef inTagClass)

四、其它

声明新的 UTI

参考文献:

  1. https://en.wikipedia.org/wiki/Uniform_Type_Identifier

  2. https://developer.apple.com/library/content/documentation/FileManagement/Conceptual/understanding_utis/understand_utis_intro/understand_utis_intro.html