Запись средства импорта центра внимания

Если Ваша поддержка приложений пользовательские форматы файлов, необходимо обеспечить средство импорта Центра внимания. Средство импорта Центра внимания анализирует формат файла для релевантной информации и присваивает ту информацию надлежащим атрибутам метаданных. Путем обеспечения средства импорта Вы позволяете пользователям на OS X искать соответствие файлов на локальных дисках и сетевого хранения.

Средство импорта метаданных в качестве примера включено в проект примера кода CoreRecipes.

Создание проекта средства импорта метаданных

XCode обеспечивает шаблон проекта, Средство импорта Центра внимания, обеспечивающее функциональность, обычно совместно используемую средствами импорта.

Этот шаблон создает проект с требуемыми платформами, шаблоном для Info.plist файл, шаблон для файла схемы, шаблон для локализуемого schema.strings файл, шаблон для main.c файл, содержащий необходимую реализацию CFPlugin, и GetMetadataForFile.c, скелетная реализация требуемой функции обратного вызова. Цель создает пакет CFPlugin с mdimporter расширение.

В дополнение к записи кода экстракции необходимо изменить шаблоны, чтобы указать типы файлов дескрипторы средства импорта и перечислить атрибуты метаданных, которые обеспечивает средство импорта.

Присвоение уникального идентификатора к функции импорта

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

При создании нового проекта средства импорта метаданных XCode создает UUID для средства импорта. Вот является пример UUID, сгенерированным XCode для средства импорта метаданных:

8AED83B3-C412-11D8-85A3-000393D59866

Это значение используется в средстве импорта Info.plist файл, а также main.c файл. Перечисление 2 показывает Info.plist шаблон сгенерирован XCode.

  Шаблон Info.plist средства импорта Метаданных перечисления 2

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
 "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleDevelopmentRegion</key>
    <string>English</string>
    <key>CFBundleDocumentTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeRole</key>
            <string>MDImporter</string>
            <key>LSItemContentTypes</key>
            <array>
                <string>SUPPORTED_UTI_TYPE</string>
            </array>
        </dict>
    </array>
    <key>CFBundleExecutable</key>
    <string>MyCustomImporter</string>
    <key>CFBundleIconFile</key>
    <string></string>
    <key>CFBundleIdentifier</key>
    <string>com.apple.yourcfbundle</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundlePackageType</key>
    <string>BNDL</string>
    <key>CFBundleSignature</key>
    <string>????</string>
    <key>CFBundleVersion</key>
    <string>1.0</string>
    <key>CFPlugInDynamicRegisterFunction</key>
    <string></string>
    <key>CFPlugInDynamicRegistration</key>
    <string>NO</string>
    <key>CFPlugInFactories</key>
    <dict>
        <key>8AED83B3-C412-11D8-85A3-000393D59866</key>
        <string>MetadataImporterPluginFactory</string>
    </dict>
    <key>CFPlugInTypes</key>
    <dict>
        <key>8B08C4BF-415B-11D8-B3F9-0003936726FC</key>
        <array>
            <string>8AED83B3-C412-11D8-85A3-000393D59866</string>
        </array>
    </dict>
    <key>CFPlugInUnloadFunction</key>
    <string></string>
</dict>
</plist>

CFPlugInFactories запись является словарем, связывающим идентификатор хоста средства импорта метаданных к UUIDs сменной функции фабрики, которой требует средство импорта. CFPluginInTypes словарь содержит ключи, связывающие UUID функции фабрики к функции. В обоих расположениях XCode вставил недавно сгенерированный UUID.

Перечисление 3 соответствующая строка от a main.c шаблон тот XCode создал бы.

Перечисление 3  , Устанавливающее средство импорта ID в main.c

#define PLUGIN_ID "8AED83B3-C412-11D8-85A3-000393D59866"

Соединение средства импорта с типом файла

Средство импорта должно быть связано с типами файлов, которые оно может импортировать. Вы делаете это путем указания универсальных идентификаторов типов (UTIs), соответствующие поддерживаемым файлам.

Поддерживаемые UTIs указаны в LSItemContentTypes массив в средстве импорта Info.plist файл. Шаблон в Перечислении 2 включает заполнителя, SUPPORTED_UTI_TYPE, это должно быть заменено UTI, который обрабатывает средство импорта. Если больше чем один тип файла поддерживается, можно добавить дополнительные строковые записи в LSItemContentTypes массив в Info.plist файл. Например, средство импорта может иметь средство импорта UTI, с SUPPORTED_UTI_Type набор к com.apple.mycocoadocumentapp.mycustomdocument.

Если Ваше приложение не определяет UTI для своих типов файлов, можно объявить один в средстве импорта Info.plist файл путем добавления UTExportedTypeDeclarations ключ. Автономные средства импорта, не соответствующие приложению, должны объявить UTIs, который они поддерживают путем указания a UTImportedTypeDeclarations ключ. UTImportedTypeDeclarations формат совпадает с UTExportedDeclarations формат, показанный в Перечислении 4. См. “Универсальные Понятия Идентификатора типа” для получения дополнительной информации об объявлении UTIs.

Перечисление 4  формат UTExportedTypeDeclarations

<key>UTExportedTypeDeclarations</key>
<array>
    <dict>
        <key>UTTypeIdentifier</key>
        <string>com.yourcompany.yourUTI</string>
        <key>UTTypeReferenceURL</key>
        <string>http://www.company.com/yourproduct</string>
        <key>UTTypeDescription</key>
        <string>Your Document Kind String</string>
        <key>UTTypeConformsTo</key>
        <array>
            <string>public.data</string>
            <string>public.content</string>
        </array>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>com.apple.ostype</key>
            <string>XXXX</string>
            <key>public.filename-extension</key>
            <array>
                <string>xxxx</string>
            </array>
        </dict>
    </dict>
</array>

Указание атрибутов метаданных

Вы должны для указания атрибутов метаданных, которые средство импорта Центра внимания возвращает путем изменения проекта schema.xml файл. Этот файл является документом XML-схемы, предоставляющим подробную информацию о возвращенных атрибутах и также позволяющим определение пользовательских атрибутов метаданных.

Перечисление 5 показывает schema.xml шаблон сгенерирован XCode.

  Средство импорта Метаданных перечисления 5 schema.xml шаблон

<?xml version="1.0" encoding="UTF-8"?>
 
<schema version="1.0" xmlns="http://www.apple.com/metadata"
                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                      xsi:schemaLocation="http://www.apple.com/metadata
file:///System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Resources/MetadataSchema.xsd">
    <note>
        Custom attributes that this metadata importer supports.  Below
    is an example of a multivalued string attribute.  Other types
    are CFNumber, CFDate, CFBoolean and CFData.
    </note>
    <attributes>
        <attribute name="com_Foo_YourAttrName" multivalued="true" type="CFString"/>
    </attributes>
 
    <types>
        <type name="SUPPORTED_UTI_TYPE">
            <note>
        The keys that this metadata importer handles.
            </note>
            <allattrs>
        com_Foo_YourAttrName
            </allattrs>
            <displayattrs>
        com_Foo_YourAttrName
            </displayattrs>
        </type>
    </types>
</schema>

Необходимо отредактировать этот шаблон для удовлетворения средству импорта метаданных.

  1. Замените SUPPORTED_UTI_TYPE заполнитель с надлежащим UTI вводит для Вашего файла.

  2. Отредактируйте attributes элемент, редактируя или удаляя attribute элементы как требуется.

    Ключи метаданных снабжаются префиксом обратную схему именования DNS, заменяя «_» с«.» для совместимости кодирования значения ключа. Каждое из этих пользовательских значений метаданных возвращает единственный CFString, как указано type атрибут attribute элемент.

    Средства импорта метаданных могут возвратить только следующие типы CF: CFString, CFNumber, CFBoolean, и CFDate. Если атрибут возвращает массив значений, type атрибут указывает тип CF и attribute элемент должен включать a multivalued атрибут со значением true. Даже если атрибут содержит только единственный элемент, это - истина.

    Если Ваше средство импорта не требует пользовательских атрибутов метаданных, можно удалить attributes элемент полностью.

  3. Отредактируйте allattrs элемент так, чтобы это содержало все Ваши ключи метаданных.

  4. Отредактируйте displayattrs элемент так, чтобы это содержало подмножество Ваших ключей метаданных, рекомендующихся для предварительного просмотра.

  5. Отредактируйте schema.strings файл для обеспечения имени дисплея и строк описания для пользовательских ключей метаданных.

Перечисление 6 показывает schema.xml файл, включенный с демонстрационным проектом средства импорта метаданных.

Перечисление 6  schema.xml файл для демонстрационного средства импорта метаданных

<?xml version="1.0" encoding="UTF-8"?>
 
<schema version="1.0" xmlns="http://www.apple.com/metadata"
                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                      xsi:schemaLocation="http://www.apple.com/metadata
file:///System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Resources/MetadataSchema.xsd">
    <note>
        Custom attributes that this metadata importer supports.  Below
    is an example of a multivalued string attribute.  Other types
    are CFNumber, CFDate, CFBoolean and CFData.
    </note>
    <attributes>
        <attribute name="com_apple_myCocoaDocumentApp_myCustomDocument_notes" multivalued="false" type="CFString"/>
    </attributes>
 
    <types>
        <type name="com.apple.mycocoadocumentapp.mycustomdocument">
            <note>
        The keys that this metadata importer handles.
            </note>
            <allattrs>
        com_apple_myCocoaDocumentApp_myCustomDocument_notes
            </allattrs>
            <displayattrs>
        com_apple_myCocoaDocumentApp_myCustomDocument_notes
            </displayattrs>
        </type>
    </types>
</schema>

Средство импорта метаданных в качестве примера объявляет один новый ключ атрибута, com_apple_myCocoaDocumentApp_myCustomDocument_notes. Ключевое имя снабжается префиксом обратную схему именования DNS, заменяя «_» с«.» для совместимости кодирования значения ключа. Каждое из этих пользовательских значений метаданных возвращает единственный CFString, как указано type атрибут attribute элемент.

Перечисление 7 показывает schema.strings файл для демонстрационного средства импорта метаданных.

  schema.strings файл средства импорта Выборки перечисления 7

"com_apple_myCocoaDocumentApp_myCustomDocument_notes" = "Notes";
"com_apple_myCocoaDocumentApp_myCustomDocument_notes.Description" = "What it is you're supposed to remember.";

Инструмент командной строки mdcheckschema выполняет простую проверку на схеме и полезен при тестировании собственной схемы средства импорта на законность.

Присвоение значений к атрибутам метаданных

Когда метаданные извлечены для файла, GetMetadataForFile функция вызвана. Функция передается сменный интерфейс, непостоянный словарь, что Вы добавляете ключи атрибута метаданных и оцениваете, тип UTI конечного файла и полный путь к конечному файлу.

Перечисление 8 показывает GetMetadataForFile скелетная реализация, предоставленная XCode в GetMetadataForFile.c.

  Реализация шаблона Listing 8 GetMetadataForFile

Boolean GetMetadataForFile(void* thisInterface,
               CFMutableDictionaryRef attributes,
               CFStringRef contentTypeUTI,
               CFStringRef pathToFile)
{
    /* Pull any available metadata from the file at the specified path */
    /* Return the attribute keys and attribute values in the dict */
    /* Return true if successful, false if there was no data provided */
 
    #warning To complete your importer please implement the function GetMetadataForFile in GetMetadataForFile.c
    return false;
}

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

Пользовательский формат файла примера является простым списком свойств, содержащим автора, заголовок и примечания напоминания. Обратите внимание на то, что пример использует Objective C и Фундаментальный класс NSDictionary считать словарь из файла. Использовать Objective C в Вашем GetMetadataForFile реализация, необходимо переименовать GetMetadataForFile.c к GetMetadataForFile.m. Перечисление 9 показывает GetMetadataForFile реализация a GetMetadataForFile функция, использующая Objective C.

  Реализация Objective C перечисления 9 GetMetadataForFile для демонстрационного средства импорта метаданных

Boolean GetMetadataForFile(void* thisInterface,
               CFMutableDictionaryRef attributes,
               CFStringRef contentTypeUTI,
               CFStringRef pathToFile)
{
    /* Pull any available metadata from the file at the specified path */
    /* Return the attribute keys and attribute values in the dict */
    /* Return true if successful, false if there was no data provided */
    Boolean success=NO;
    NSDictionary *tempDict;
    NSAutoreleasePool *pool;
 
    // Don't assume that there is an autorelease pool around the calling of this function.
    pool = [[NSAutoreleasePool alloc] init];
    // load the document at the specified location
    tempDict=[[NSDictionary alloc] initWithContentsOfFile:(NSString *)pathToFile];
    if (tempDict)
    {
    // set the kMDItemTitle attribute to the Title
    [(NSMutableDictionary *)attributes setObject:[tempDict objectForKey:@"title"]
                          forKey:(NSString *)kMDItemTitle];
 
    // set the kMDItemAuthors attribute to an array containing the single Author
    // value
    [(NSMutableDictionary *)attributes setObject:[NSArray arrayWithObject:[tempDict objectForKey:@"author"]]
                          forKey:(NSString *)kMDItemAuthors];
 
    // set our custom document notes attribute to the Notes value
    // (in the real world, you'd likely use the kMDItemTextContent attribute, however that
    // would make it hard to demonstrate using a custom key!)
    [(NSMutableDictionary *)attributes setObject:[tempDict objectForKey:@"notes"]
                          forKey:@"com_apple_myCocoaDocumentApp_myCustomDocument_notes"];
 
    // return YES so that the attributes are imported
    success=YES;
 
    // release the loaded document
    [tempDict release];
    }
    [pool release];
    return success;
}