2013-05-03 2 views
4

Я написал Spotlight Importer для настраиваемого типа документа, которое определяет мое приложение.Пользовательский импортер Spotlight и Finder's Get Info «Дополнительная информация»

Все работает нормально, поля метаданных правильно проиндексированы Spotlight (проверено командой mdls), а поиск в Spotlight показывает мои документы.

Единственная проблема, с которой я столкнулся, состоит в том, что элементы, указанные в разделе <displayattrs> файла schema.xml, не отображаются в разделе «Дополнительная информация», когда я запрашиваю информацию о файле (Cmd + I в Finder).

Я ожидал, что эти поля появятся там, потому что я объявил их как в разделах .

Я нашел здесь несколько вопросов, связанных с этой проблемой, ни одна из них не помогла мне.

Импортер подключен к приложению, загруженному системой (mdimport -L подтвердил это). Кроме того, структура пакета кажется правильной, в папке «Ресурсы» отображается schema.xml, а также schema.strings в папке en/lproj.

Вот что schema.xml файл выглядит следующим образом:

<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"> 
<types> 
    <type name="com.mydomain.myapp.mydocument"> 
     <allattrs> 
      kMDItemTitle kMDItemAuthors kMDItemAlbum 
     </allattrs> 
     <displayattrs> 
      kMDItemTitle kMDItemAuthors kMDItemAlbum 
     </displayattrs> 
    </type> 
</types> 

Пару вещей более, моя система не хватает команды mdcheckschema, но файл XML так Короче говоря, я сомневаюсь, есть проблема с синтаксисом.
Иногда в разделе «Дополнительная информация» отображается дата последнего открытия файла, иногда ничего.
Наконец, я попытался реимпортировать файл (mdimport), но безрезультатно.

Я бегу Mac OS X Moutain Lion 10.8.3, Xcode 4.6.2.

Итак, вот мой вопрос, я что-то упустил, чтобы эти предметы отображались в разделе «Дополнительная информация»? Есть ли кто-то, кто испытал такую ​​проблему и нашел решение?

Edit:

Никто не ответил на мой вопрос до сих пор, может быть, кто-то может мне точку в какой-то учебник или документации об этой проблеме?

ответ

9

Я знаю, что Винс, вероятно, давно решил это (или сдался). Но я только что потратил довольно долгое время на работу с различными документально оформленными или полностью недокументированными проблемами с написанием импортера, поэтому мне показалось, что я буду документировать свои выводы здесь. (Боюсь, это превратилось в эссе - это сложный вопрос).

Давайте предположим:

  • Вы читали documentation о том, как написать импортер Spotlight, в частности, руководство по устранению неполадок.
  • Вы написали и отладили своего импортера.

    Для отладки импортеру в Xcode выбрать Product-> схемное> Редактировать Схема и установить:

    • > Executable Инфо-к /usr/bin/mdimport
    • Arguments-> Аргументы в -n -d2 -g $(BUILT_PRODUCTS_DIR)/$(WRAPPER_NAME) /path/to/some/test/file.ext
    • Options-> Работа Справочник до $(SRCROOT)

    И установите точку останова на функцию GetMetadataForURL().

  • Результат от /usr/bin/mdimport -n -d2 -g /path/to/your/importer.mdimporter /path/to/some/test/file.ext правильно содержит стандартные и/или настраиваемые атрибуты метаданных, которые вы намеревались.
  • Вы развернули свой импортер для тестирования (автономный в/Library/Spotlight/или встроенный в комплект приложений), а mdimport -L перечисляет ваш импортер.
  • Но вывод mdls /some/other/file.ext и/или окна Finder's Get Info не показывают ожидаемые атрибуты метаданных.

Вот некоторые вещи, чтобы проверить:

  1. Кто-то должно объявить УИП (ы) для данного типа документа (ов), которые вы импортер.

    • Если вы импортируете документ типа system-declared, то OSX объявила UTI для вас.
    • Если ваш импортер встроен в комплект приложений, приложение должно объявить UTI с помощью ключа UTExportedTypeDeclarations в Info.plist приложения.
    • Если вы импортируете тип документа третьей стороны, убедитесь, что приложение, которое «владеет» типом документа, объявило UTI для него в файле UTExportedTypeDeclarations в Info.plist приложения. Если приложение не объявило UTI (некоторые не используют и по-прежнему используют старый ключ CFBundleDocumentTypes ->CFBundleTypeExtensions) или если вы хотите, чтобы ваш импортер работал, даже если приложение не установлено, вам нужно будет создать " dummy ", единственной целью которого является объявление UTI (ов) в файле UTImportedTypeDeclarations в Info.plist приложения. Установите «фиктивное» приложение где-нибудь как/Library/Application Support/myOrg/myApp.app. Ваш импортер должен быть автономным и не должен быть встроен в пакет этого приложения, поскольку Spotlight не будет запускать импортеров из приложения, которое пользователь не открыл.

    Там нет смысла объявляя УИП (ы), которые вы импортируете в UTImportedTypeDeclarations или UTExportedTypeDeclarations ключей в Info.plist вашего импортера - LaunchServices не будет надежно читать их оттуда так Spotlight не признает их , Однако вы должны зарегистрировать свою заинтересованность в UTI (0) по , ссылаясь на им на CFBundleDocumentTypes ->LSItemContentTypes ключа (ов) в Info.plist вашего импортера.

    Симптомы кого-то другого что не объявляются правильно ИМП является то, что mdimport -n -d1 /some/file.ext говорит:

    • Imported '/some/file.ext' of type 'dyn.xxx' ... или (смешения):
    • Imported '/some/file.ext' of type 'the.correct.uti' with no plugIn.

    .

  2. Если атрибут, который ваш импортер возвращается не указан в схеме метаданных для ИМПА вашего документа, или для любого родителя ИМП, затем Прожектора бросает этот атрибут прочь. Даже если это стандартный атрибут, например kMDItemAuthors. Чтобы понять, почему мы должны смотреть на то, как работает Spotlight подробно:

    • Приложение объявляет одну или более ИМП в ключе UTImportedTypeDeclarations или UTExportedTypeDeclarations.
    • В каждой декларации UTI приложение указывает один или несколько «родительских» UTI в ключе UTTypeConformsTo. Родительский UTI должен быть чем-то конкретным, если это возможно - например. «public.image», если приложение объявляет новый тип файла изображения - или просто «public.data», если ничего не подходит.

      • Вы можете увидеть текущее состояние иерархии ИМП путем вчитывался содержимого базы данных LaunchServices: /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -dump.
      • Но это сложно расшифровать. К счастью, вас обычно интересует иерархия UTI «чистой» машины, которая может быть получена plutil -p /System/Library/CoreServices/CoreTypes.bundle/Contents/Info.plist.
    • Spotlight поддерживает «схему», в котором перечислены metatdata атрибуты интереса к нему:

      • Вы можете увидеть текущее состояние схемы метаданных с mdimport -X 2>&1.
      • Вы можете увидеть схему метаданных «чистой» машины в /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Resources/schema.plist.
    • Когда Spotlight решает, что хранить его, перекрестные ссылки на выходные данные вашего импортера как на иерархию UTI, так и на схему метаданных. Таким образом, для каждого атрибута, возвращаемого вашим импортером:

      • Spotlight просматривает UTI документа в схеме метаданных. Если существует запись для UTI, тогда Spotlight проверяет, указан ли атрибут, который возвращает ваш импортер, под ключом allattrs. Если это тогда, Spotlight записывает значение, предоставленное вашим импортером в его базе данных.
      • В противном случае Spotlight ищет родительский UTI в иерархии UTI и повторяет этот процесс до тех пор, пока он не попадет в public.data.
      • Если Spotlight не может найти атрибут, указанный в ключе allattrs для UTI вашего документа, или для любых родительских UTI, он отбрасывает значение, предоставленное вашим импортером.

    .

  3. Если атрибут, который хранится в базе данных Spotlight нет в списке для отображения в схеме метаданных для ИМП вашего документа, или для любого родителя ИМП, затем «Get Info» окно Finder будет не отображать его. Даже если это стандартный атрибут, например kMDItemAuthors.

    • Finder следует аналогичному процессу высветить выше, за исключением того, что он консультируется с displayattrs ключей, а allattrs ключей в базе метаданных.
    • Порядок отображения атрибутов зависит от их положения в иерархии схемы метаданных.

    .

  4. Если вы хотите контролировать, какие магазины Spotlight и/или какое окно Finder's Get Info, то ваш импортер должен предоставить собственную схему.

    • Формат для пользовательского schema.xml достаточно хорошо документирован. К сожалению, команда mdcheckschema, упомянутая в документации, больше не поставляется с Xcode. Если у вас есть машина со старой версией OSX & Xcode, вы можете скопировать ее с /usr/bin/mdcheckschema. Если у вас есть учетная запись Apple Developer, вы можете извлечь ее из /Packages/DeveloperToolsCLI.pkg на «Xcode 4.2 for Snow Leopard» dmg.
    • Вам не нужно перечислять все атрибуты, которые ваш импортер поддерживаемых клавишами allattrs и displayattrs - только те атрибуты, которые не являются перечислены для одного из родителей или прародителей ИМПА в /System/Library/Frameworks/CoreServices.framework /Frameworks/Metadata.framework/Resources/schema.plist.
    • Однако, если вы хотите управлять заказом, в котором атрибуты отображаются в окне «Получить информацию», вы должны указать атрибуты, которые вы хотите отобразить сначала в нужном порядке в ключе displayattrs. (См., Например, «public.movie» в схеме, которая дублирует некоторые ключи из своего родительского «public.audiovisual-content», чтобы они отображались в первую очередь).
    • Ваша схема должна определить как минимум один пользовательский атрибут в разделе attributes и ссылаться на него в ключе allattrs, иначе Spotlight игнорирует всю схему. Если ваш импортер не предоставляет какие-либо пользовательские атрибуты, тогда просто добавьте фиктивный пользовательский атрибут в схему. (Это требование появилось через некоторое время после Snow Leopard и полностью недокументировано, и, вероятно, там, где Винс ошибался).
    • Если ваша схема определяет пользовательский атрибут (и он должен, см. Предыдущую точку), то вы должны снабдить английскую локацию schema.strings, иначе Spotlight игнорирует всю схему. (Конечно, вы также можете предоставить другие локализации).
    • Убедитесь, что у вас есть фаза «Копирование запаса» в проекте Xcode, который копирует schema.xml и schema.strings в ваш продукт.
    • Дважды проверьте содержимое/Ресурсы/schema.xml и Содержание/Ресурсы/en.lproj/schema.strings или Содержание/Ресурсы/English.lproj/schema.strings действительно есть в вашем построенном продукте; некоторые более старые версии Xcode не копировали их.
    • Убедитесь, что file /path/to/your/built/importer.mdimporter/Contents/Resources/en.lproj/schema.strings говорит:
      • Little-endian UTF-16 Unicode c program text.

    симптом получения любого из вышеуказанных неправильно, что mdimport -X 2>&1 | grep -A20 uti.of.interest либо ничего не возвращает или возвращает пустую схему для ИМП, что schema.xml вашего импортера пытается определить.

  5. Прожектор не всегда замечает изменения своевременно.

    • При тестировании обновленной версии вашего импортера сначала удалить старый импортер (или все приложение, которое содержит его, если он встроен в приложении пачке) и введите mdimport -L, чтобы проверить, что Spotlight заметил, что это пошло (это может до 30 секунд) перед развертыванием обновленной версии. Введите mdimport -L еще раз, чтобы проверить, что Spotlight заметил обновленную версию (это может занять около 30 секунд), прежде чем возобновлять тестирование.
    • Если вы распространяете автономный импортер в файле .pkg, то вы должны включить сценарий postinstall в 1: сообщить LaunchServices, что пакет был обновлен (установщик делает это автоматически для приложений, но не для других типов пакетов) и 2: удар Spotlight в переиндексации для текущего пользователя типы документов, что ваш импортер понимает:

      #!/bin/sh touch -c "$2" if [ -n "$USER" ]; then sudo -u "$USER" /usr/bin/mdimport -r "$2"; fi true

  6. LaunchServices не всегда замечают изменения своевременно, и сохраняет старые информация, лежащая вокруг.

    • Если вы делаете изменения в декларации ИМП (ы) в приложение, которое декларирует их, или УИП (ов), что ваши регистры импортера затем LaunchServices и Spotlight может запутаться. Вы можете полностью восстановить LaunchServices и получить его перечитать из стандартных мест с:

      /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -v -kill -seed -domain system -domain network -domain local -domain user

      Это также полезно, если вы хотите, чтобы имитировать «чистой» установки вашего импортера и/или приложения на вашем развитии система.

Редактировать: This project на GitHub показаны точки 1-5 выше.

Смежные вопросы