Запись средства импорта центра внимания
Если Ваша поддержка приложений пользовательские форматы файлов, необходимо обеспечить средство импорта Центра внимания. Средство импорта Центра внимания анализирует формат файла для релевантной информации и присваивает ту информацию надлежащим атрибутам метаданных. Путем обеспечения средства импорта Вы позволяете пользователям на 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> |
Необходимо отредактировать этот шаблон для удовлетворения средству импорта метаданных.
Замените
SUPPORTED_UTI_TYPE
заполнитель с надлежащим UTI вводит для Вашего файла.Отредактируйте
attributes
элемент, редактируя или удаляяattribute
элементы как требуется.Ключи метаданных снабжаются префиксом обратную схему именования DNS, заменяя «_» с«.» для совместимости кодирования значения ключа. Каждое из этих пользовательских значений метаданных возвращает единственный CFString, как указано
type
атрибутattribute
элемент.Средства импорта метаданных могут возвратить только следующие типы CF:
CFString
,CFNumber
,CFBoolean
, иCFDate
. Если атрибут возвращает массив значений,type
атрибут указывает тип CF иattribute
элемент должен включать amultivalued
атрибут со значениемtrue
. Даже если атрибут содержит только единственный элемент, это - истина.Если Ваше средство импорта не требует пользовательских атрибутов метаданных, можно удалить
attributes
элемент полностью.Отредактируйте
allattrs
элемент так, чтобы это содержало все Ваши ключи метаданных.Отредактируйте
displayattrs
элемент так, чтобы это содержало подмножество Ваших ключей метаданных, рекомендующихся для предварительного просмотра.Отредактируйте
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; |
} |