Учитывая UTI (идентификатор единого типа), найдите все типы, которым он соответствует
-
29-09-2019 - |
Вопрос
Я пишу приложение, которое использует Однородные идентификаторы типа. Анкет В частности, я звоню UTTypeCreateAllIdentifiersForTag()
и передавать это различным Мима типы
Моя надежда была то, что эта функция (в отличие от UTTypeCreatePreferredIdentifierForTag()
) даст мне самые специфические UTI, а также все UTIS, к которым он соответствует. Это кажется, что это не так - это либо возвращает один UTI, либо вторичный UTIS ложки.
Здесь UTTypeConformsTo()
Функция определена в одном файле заголовка, но я предпочел функцию, которая возвращает массив всех типов, к которым этот UTI соответствует.
Там, кажется, на меня надежда, как MDItemCopyAttributeList()
Вернут такой список. Тем не менее, это требует MDItemRef
, который может быть создан из пути файла или URL-адреса - который не отлично. Иногда мои данные хранятся только в памяти, и у меня есть только тип MIME.
Должен ли я перейти через всю базу данных UTIS, чтобы получить эту информацию или мне что-то упустить?
Решение
Я действительно не хватал чего-то: очень очевидное решение. В то время как я разговаривал через символы, экспортируемые LaunchServices
(и заметил интересный, но частное UTTypeCopyPedigree()
), Я напомнил о UTTypeCopyDeclaration()
, который является определенный.
UTTypeCopyDeclaration()
дается ИМП и возврат (как CFDictionaryRef
) Список свойств, в котором был определен UTI. Объект в этом словаре с ключом kUTTypeConformsToKey
либо а CFArrayRef
или CFStringRef
. Анкет В случае массива можно рекурсивно повторить, пока не будет достигнут базовый тип.
Вот как я создал дерево наследства для данного UTI. Я надеюсь, что это поможет кому-либо еще с той же проблемой.
Другие советы
https://github.com/nst/utisexplorer Создает график иерархии UTIS в формате «DOT» для Graphviz.