По заданному UTI (универсальному идентификатору типа) найдите все типы, которым он соответствует - PullRequest
6 голосов
/ 11 октября 2010

Я пишу приложение, которое использует Унифицированные идентификаторы типов . В частности, я звоню UTTypeCreateAllIdentifiersForTag() и передаю различные типы MIME .

Я надеялся, что эта функция (в отличие от UTTypeCreatePreferredIdentifierForTag()) даст мне наиболее конкретный UTI, а также все UTI, которым она соответствует. Похоже, что это не так - он либо возвращает один UTI, либо вторичные UTI являются ложными.

В этом же файле заголовка определена функция UTTypeConformsTo(), но я бы предпочел функцию, которая возвращает массив всех типов, которым соответствует этот UTI.

Кажется, у меня есть надежда, поскольку MDItemCopyAttributeList() вернет такой список. Тем не менее, он требует MDItemRef, который может быть создан из пути к файлу или URL - что не очень хорошо. Иногда мои данные хранятся только в памяти, и у меня есть только MIME-тип.

Нужно ли перебирать всю базу данных UTI, чтобы получить эту информацию, или я что-то упустил?

Ответы [ 2 ]

7 голосов
/ 22 октября 2010

Я действительно что-то упустил: очень очевидное решение. Пока я пробирался через символы, экспортированные LaunchServices (и заметил интересное, но личное UTTypeCopyPedigree()), мне напомнили UTTypeCopyDeclaration(), который определен .

UTTypeCopyDeclaration() получает UTI и возвращает (как CFDictionaryRef) список свойств, в котором был определен UTI. Объект в этом словаре с ключом kUTTypeConformsToKey является либо CFArrayRef, либо CFStringRef. В случае массива можно рекурсивно выполнять итерации, пока не будет достигнут базовый тип.

Вот как я построил дерево наследования для данного UTI. Я надеюсь, что это поможет кому-то еще с той же проблемой.

0 голосов
/ 09 февраля 2016

https://github.com/nst/UTIsExplorer создает график иерархии ИМП в формате "точка" для графвиз.

...