Принятие универсальных идентификаторов типов

Эта глава дает некоторые инструкции для принятия универсальных идентификаторов типов в Вашем приложении и дает обзор служебных функций, используемых для управления UTIs.

Инструкции для использования UTI

Принятие UTIs в Вашем приложении является процессом с двумя частями. Необходимо использовать UTIs каждый раз, когда необходимо идентифицировать или обмениваться данными, и необходимо объявить определенный UTIs для любых собственных типов использование приложения.

Добавление поддержки UTI приложениям OS X

Apple использует UTIs всюду по OS X. Например: здание в UTI поддерживает для большинства потребностей обмена данными. Например, следующие технологии вся поддержка UTIs:

  • Менеджер по Области монтажа и Услуги по переводу используют UTIs для идентификации типов данных.

  • Navigation Services позволяет Вам указывать UTIs для фильтрации файла.

  • Launch Services поддерживает основанные на UTI требования документа.

  • NSView и NSWindow поддерживают основанные на UTI обещания перетаскивания.

  • NSDocument, NSOpenPanel, NSSavePanel и NSWorkspace вся поддержка UTIs.

  • NSSound, NSImage и NSImageRep используют UTIs для возврата поддерживаемых форматов данных.

Далее, Apple осудил большинство более старых механизмов для идентификации данных в пользу UTIs.

Если у Вас есть определенные потребности, не удовлетворенные вышеупомянутым, можно соответствовать типы к UTIs в собственном коде. Обычно это требует, чтобы Вы нашли тип с альтернативным идентификатором (такой как OSType), создайте UTI из того идентификатора, затем проверьте на соответствие с UTIs определение типов, которые может обработать Ваше приложение. Для примера того, как сделать это, посмотрите Задачи Navigation Services в Руководстве по программированию Navigation Services.

Добавление Поддержки UTI приложениям для iOS

приложения для iOS используют UTIs для представления типов области монтажа. Для получения дополнительной информации см. Ссылку класса UIPasteboard.

Обзор функций UTI

Можно найти, что функции раньше управляли UTIs в UTType.h в платформе Launch Services на OS X и платформе MobileCoreServices на iOS.

Тестирование на равенство и соответствие

При тестировании, чтобы видеть, идентичны ли два UTIs, необходимо всегда использовать UTTypeEqual функциональное а не прямое сравнение строк:

Boolean UTTypeEqual (
        CFStringRef inUTI1,
        CFStringRef inUTI2
    );

Два UTIs равны если

  • строки UTI идентичны

  • спецификация тега динамического идентификатора является подмножеством спецификации тега другого UTI.

Однако во многих случаях Вы хотите определить, совместим ли один UTI с другим, когда необходимо проверить на соответствие, а не равенство:

Boolean UTTypeConformsTo (
        CFStringRef inUTI1,
        CFStringRef inUTI2
    );

UTTypeConformsTo функциональные возвраты true если inUTI1 соответствует inUTI2. Отношения соответствия являются переходными: если A соответствует B, и B соответствует C, то A соответствует C.

Управление тегами

Часто для использования UTIs эффективно необходимо быть в состоянии преобразовать различные другие идентификаторы типов (OSType, MIME, и т.д.) к UTIs и наоборот.

Для преобразования идентификатора в UTI можно использовать UTTypeCreatePreferredIdentifierForTag функция:

CFStringRef UTTypeCreatePreferredIdentifierForTag(
        CFStringRef inTagClass,
        CFStringRef inTag,
        CFStringRef inConformingToUTI
    );

Для класса тега Вы передаете одну из следующих констант класса тега, определяющих альтернативные идентификаторы:

const CFStringRef kUTTagClassFilenameExtension;
const CFStringRef kUTTagClassMIMEType;
const CFStringRef kUTTagClassNSPboardType;
const CFStringRef kUTTagClassOSType;

Можно передать UTI в inConformingToUTI параметр как подсказка, в случае, если данный тег появляется больше чем в одном объявлении UTI. Например, если Вы знаете, что тег расширения файла связан с файлом, не каталогом, можно передать public.data здесь, который заставляет функцию игнорировать любые типы с тем же расширением, соответствующие public.directory. Передача NULL для этого параметра, если у Вас нет подсказок.

В редком случае, что два или больше типа существуют, которые имеют тот же идентификатор, эта функция предпочитает общедоступный UTIs по другим. Если не заявленный UTI существует для идентификатора, UTTypeCreatePreferredIdentifierForTag создает и возвращает динамический идентификатор.

Если Вы хотите получить все UTIs, соответствующие данному идентификатору, можно вызвать UTTypeCreateAllIdentifiersForTag:

CFArrayRef UTTypeCreateAllIdentifiersForTag(
    CFStringRef inTagClass,
    CFStringRef inTag,
    CFStringRef inConformingToUTI );

Эта функция возвращает массив UTIs, который можно исследовать для определения который использовать.

Если Вы хотите создать альтернативный идентификатор из UTI, Вы вызываете UTTypeCopyPreferredTagWithClass функция:

CFStringRef UTTypeCopyPreferredTagWithClass(
    CFStringRef inUTI,
    CFStringRef inTagClass );

Предпочтительный тег является первым, перечисленным в массиве спецификации тега для данного класса тега.

Преобразование идентификаторы OSType

Функции утилиты UTI предполагают, что все альтернативные теги идентификатора могут быть представлены как Базовые строки Основы. Однако, потому что тип OSType основано на целом числе, а не основан на операция со строками, может не быть сразу очевидно, как правильно перевести между типом CFStringRef и введите OSType. Для обеспечения безошибочного кодирования и декодирования идентификаторов OSType используйте следующие функции преобразования:

CFStringRef UTCreateStringForOSType( OSType inOSType );
 
OSType UTGetOSTypeFromString( CFStringRef inTag );

Доступ информация о UTI

Для получения копии объявления UTI используйте UTTCopyDeclaration функция:

CFDictionaryRef UTTypeCopyDeclaration(
    CFStringRef inUTI );

Для получения URL к пакету, содержащему объявление для данного UTI используйте UTTypeCopyDeclaringBundleURL функция:

CFURLRef UTTypeCopyDeclaringBundleURL(
    CFStringRef inUTI );

Для получения локализованного описания данного UTI вызовите UTTypeCopyDescription функция:

CFStringRef UTTypeCopyDescription(
    CFStringRef inUTI );