我正在编写一个使用Uniform Type Identifiers的应用程序。具体来说,我正在调用UTTypeCreateAllIdentifiersForTag()
并将其传递给各种MIME类型。
我希望这个功能(与UTTypeCreatePreferredIdentifierForTag()
不同)会给我最具体的UTI以及它所符合的所有UTI。这似乎不是这种情况 - 它要么返回单个UTI,要么辅助UTI是虚假的。
在同一个头文件中定义了UTTypeConformsTo()
函数,但我更喜欢一个返回此UTI符合的所有类型数组的函数。
我似乎有希望,因为MDItemCopyAttributeList()
会返回这样的清单。也就是说,它需要MDItemRef
,可以从文件路径或URL创建 - 这不是很好。有时我的数据只存储在内存中,我只有一种MIME类型。
我是否必须遍历UTI的整个数据库以获取此信息,或者我错过了哪些内容?
答案 0 :(得分:7)
我确实遗漏了一些东西:非常明显的解决方案。当我浏览LaunchServices
导出的符号时(注意到有趣但私密的UTTypeCopyPedigree()
),我被提醒UTTypeCopyDeclaration()
,其中是定义的。
UTTypeCopyDeclaration()
被赋予UTI并返回(作为CFDictionaryRef
)定义UTI的属性列表。此词典中包含键kUTTypeConformsToKey
的对象可以是CFArrayRef
或CFStringRef
。在数组的情况下,可以递归迭代直到达到基类型。
这是我为给定的UTI构建继承树的方法。我希望这可以帮助其他人解决同样的问题。
答案 1 :(得分:0)
https://github.com/nst/UTIsExplorer为graphviz生成“点”格式的UTI层次结构图。