Поиск и устранение неисправностей средств импорта центра внимания
Редкий проект, который безупречен от запуска. Поиск и устранение неисправностей средства импорта Центра внимания может быть трудным, учитывая, что он выполняется системой автоматически как требуется и выполняется вне среды разработки.
Эта статья описывает, как явно выполнить Ваше средство импорта метаданных для тестирования и обеспечивает много методов для поиска и устранения неисправностей проблем.
Где я должен установить свое средство импорта Центра внимания?
Средство импорта Центра внимания приложения находится в пакете приложения в подкаталоге MyApp.app/Contents/Library/Spotlight
. Автономные средства импорта могут быть установлены в одном из следующих расположений:
~/Library/Spotlight |
/Library/Spotlight |
Если Ваше средство импорта не является частью комплекта приложений, создайте пакет установщика, устанавливающий средство импорта в одном из вышеупомянутых расположений. Для импортирования существующих файлов у Вас должен быть a postinstall
сценарий для Вашего установщика, включающего следующую команду, указывая Ваше расположение установки средства импорта:
/usr/bin/mdimport -r InstallDirectory/YourPlug-In |
Когда будет средство импорта Центра внимания в моих переиндексных файлах комплекта приложений?
Когда пользователь сначала запускает Ваше приложение, средство импорта Центра внимания найдено, и Центр внимания начинает импортировать любые существующие файлы. При обновлении приложения и средства импорта Центра внимания удостоверьтесь, что пакет средства импорта имеет различную отметку даты. Когда обновленное приложение запущено впервые, Центр внимания повторно индексирует существующие файлы с новым средством импорта.
Как я могу определить, находится ли мое средство импорта Центра внимания?
Выполнение mdimport
команда (расположенный в /usr/bin
) с -L
опция возвращает список всех в настоящее время распознанных средств импорта и их путей.
/usr/bin/mdimport -L |
2005-01-16 02:56:37.634 mdimport[673] Paths: id(501) ( |
"/System/Library/Spotlight/RichText.mdimporter", |
"/System/Library/Spotlight/Image.mdimporter", |
"/System/Library/Spotlight/Audio.mdimporter", |
"/System/Library/Spotlight/Font.mdimporter", |
"/System/Library/Spotlight/PDF.mdimporter", |
"/System/Library/Spotlight/Chat.mdimporter", |
"/System/Library/Spotlight/iCal.mdimporter", |
"/System/Library/Spotlight/Mail.mdimporter", |
"/System/Library/Spotlight/QuickTime.mdimporter", |
"/System/Library/Spotlight/vCard.mdimporter", |
"/Users/me/Library/Spotlight/MyCustomImporter.mdimporter", |
"/System/Library/Spotlight/QuartzComposer.mdimporter", |
"/System/Library/Spotlight/PS.mdimporter", |
"/System/Library/Spotlight/SystemPrefs.mdimporter", |
"/System/Library/Spotlight/Application.mdimporter" |
) |
Почему не находит мое связанное средство импорта?
Если Ваше средство импорта находится в обертке Вашего приложения, это не может быть найдено автоматически во время тестирования. Когда дата модификации пакета изменяется, средства импорта обнаруживаются. Можно явно зарегистрировать приложение путем указания -f
флаг к lsregister
. lsregister
инструмент найден в /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Versions/A/Support/
на OS X v10.5 и позже.
lsregister -f MyApp.app |
Другая возможность состоит в том, что Ваше приложение может быть недоверяемым. Средства импорта центра внимания не загружаются из ненадежных приложений. Запуск приложения впервые заставляет приложение доверяться.
Я обновил свое средство импорта и скопировал его в каталог Spotlight, но все еще используется старое средство импорта
Новые средства импорта Центра внимания обнаруживаются путем сравнения даты модификации средства импорта. Если дата совпадает с ранее загруженным средством импорта, новое средство импорта автоматически не обнаруживается. Если Вы копируете обновленное средство импорта в использование каталога Spotlight cp -r
, на изменения не обращает внимание Центр внимания. Решение состоит в том, чтобы или удалить существующее средство импорта прежде, чем скопировать обновленную версию или использовать touch
команда на средстве импорта .mdimporter
каталог для явного обновления даты.
Как я тестирую свое средство импорта?
Можно протестировать средство импорта Центра внимания с помощью mdimport
команда (расположенный в /usr/bin
). Выполненный mdimport
с набором уровня отладки к 2 и указывают файл, из которого можно импортировать данные:
/usr/bin/mdimport -d2 test.myCustomDocument |
Эта команда производит как это:
2005-01-16 02:59:04.930 mdimport[678] Import '/Users/me/Documents/test.myCustomDocument' |
type 'com.apple.mycocoadocumentapp.mycustomdocument' |
using 'file://localhost/Users/me/Library/Spotlight/MyCustomImporter.mdimporter/' |
2005-01-16 02:59:04.931 mdimport[678] Sending attributes |
of '/Users/me/Documents/test.myCustomDocument' to server. |
Attributes: '{ |
"_kMDItemImporterCrashed" = <null>; |
"com_apple_metadata_modtime" = 127555123.1940155; |
"com_apple_myCocoaDocumentApp_myCustomDocument_notes" = "Remember to feed the cats!"; |
kMDItemAuthors = ("Tori”,”Simon",”Daniel”); |
kMDItemContentType = "com.apple.mycocoadocumentapp.mycustomdocument"; |
kMDItemContentTypeTree = ("com.apple.mycocoadocumentapp.mycustomdocument", "public.data", "public.item"); |
kMDItemDisplayName = {"" = "test.myCustomDocument"; }; |
kMDItemKind = {en = DocumentType; }; |
kMDItemTitle = "Be sure to remember to..."; |
}' |
Первая строка вывода указывает файл, импортирующийся, а также UTI что карты файлов к. Остающиеся строки перечисляют ключи атрибута и значения, импортированные из файла.
Необходимо гарантировать, что все надлежащие ключи метаданных, что возвраты средства импорта присутствуют в выводе. Вы заметите, что много ключей метаданных, определенных для файловой системы, также доступны для каждого файла. Они предоставлены системой метаданных и не являются Вашей ответственностью.
Как я отлаживаю свое средство импорта с помощью gdb?
Можно отладить средство импорта путем выполнения mdimport
под gdb
.
Следующие загрузки команды mdimport
под gdb
:
gdb mdimport |
После mdimport
запустил, установил точку останова на Вашей функции импорта:
b MyImporterGetAttributesFromFileFunction |
Тогда запустите mdimport
процесс, указывая файл для импорта:
r /path/to/my/test/file |
Что система думает, что UTI для файла?
Можно определить UTI, что система думает, принадлежит файлу при помощи mdimport
команда с уровнем отладки 1:
/usr/bin/mdimport -d1 test.myCustomDocument |
Вывод показывает тип UTI, что система определила для файла:
2005-01-16 03:00:07.212 mdimport[683] Import '/Users/me/Documents/ test.myCustomDocument' |
type 'com.apple.mycocoadocumentapp.mycustomdocument' using |
'file://localhost/Users/me/Library/Spotlight/MyCustomImporter.mdimporter/' |
Тип должен соответствовать UTI, который поддерживает Ваше средство импорта.
Выполнение mdimport ничего не возвращает
При выполнении mdimport
с уровнем отладки 1 возврата никакой вывод необходимо гарантировать, что файл, который Вы пытаетесь импортировать, не находится в /tmp
каталог или некоторый другой каталог System. Файлы в тех расположениях не импортируются.
Выполнение mdimport возвращает неожиданный UTI
При выполнении mdimport
возвращает UTI кроме одного, Вы ожидаете, необходимо будет гарантировать, что файл, который Вы пытаетесь импортировать, является фактически типом файла, Вы думаете, что это. UTI файла определяется дополнительным или типом файла.
Также возможно, что возвращается динамический UTI:
2005-01-16 03:01:16.989 mdimport[691] Import '/Users/me/Documents/test.myCustomDocument' |
type 'dyn.ah62d4rv4ge8048pdsz31k55rqv10g7prqz1hkqu' no mdimporter |
Как правило, возврат динамического UTI указывает, что файл не отображается на известный UTI. Необходимо проверить что:
Тестовый файл является корректным типом файла.
Тестовый файл имеет корректное расширение файла или набор типа файла.
Если Ваше приложение объявляет, что UTI вводят для файла, что приложение
Info.plist
файл имеет корректные записи вUTExportedTypeDeclarations
запись как показано здесь:<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>My Document Type</string>
<key>UTTypeIdentifier</key>
<string>com.apple.mycocoadocumentapp.mycustomdocument</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>myCustomDocument</string>
</array>
<key>com.apple.ostype</key>
<string>T78q</string>
</dict>
</dict>
</array>
Гарантируйте, что Ваше приложение живет в расположении, где Launch Services может обнаружить отображения. Запуск приложения также гарантирует, что сделаны отображения.
mdimport не возвращает мои атрибуты метаданных
При выполнении mdimport
с уровнем отладки 3 не перечисляет ни одного из Ваших пользовательских атрибутов метаданных, необходимо проверить что:
Ваше средство импорта метаданных находится с помощью
mdimport -L
команда.Ваше средство импорта метаданных
Info.plist
файл имеет корректный сменный тип для средств импорта метаданных вCFPlugInTypes
запись. Ключ должен быть8B08C4BF-415B-11D8-B3F9-0003936726FC
:<key>CFPlugInTypes</key>
<dict>
<key>8B08C4BF-415B-11D8-B3F9-0003936726FC</key>
<array>
<string>8AED83B3-C412-11D8-85A3-000393D59866</string>
</array>
</dict>
UUID, который Вы создали для своего средства импорта, уникален и находится в обоих
CFPlugInFactories
иCFPluginTypes
записи средства импортаInfo.plist
файл. Здесь, UUID8AED83B3-C412-11D8-85A3-000393D59866
:<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>
У Вас есть корректный тип UTI для Вашего средства импорта, перечисленного в
LSItemContentTypes
запись в средстве импортаInfo.plist
файл:<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>MDImporter</string>
<key>LSItemContentTypes</key>
<array>
<string>com.apple.mycocoadocumentapp.mycustomdocument</string>
</array>
</dict>
</array>
Ваш UTI является всем нижним регистром в
Info.plist
иschema.xml
файлы.Если Ваше средство импорта читает метаданные из пакета файла, гарантируйте что
UTTypeConformsTo
запись в средстве импортаInfo.plist
файл включаетcom.apple.package
как файл UTI.Ваш
schema.xml
файл допустим.Можно протестировать ли Ваш
schema.xml
файл хорошо формируется путем выполнения командыmdcheckschema
(расположенный в/usr/bin
)./usr/bin/mdcheckschema ~/Library/Spotlight/MyCustomImporter.mdimporter/Contents/Resources/schema.xml
/Users/me/Library/Spotlight/MyCustomImporter.mdimporter/Contents/Resources/schema.xml : succesfully parsed.
Ваша реализация
GetMetadataForFile
заполняет словарь с корректными записями метаданных и возвращаетсяtrue
.Вы возвращаете только CFTypes CFString, CFNumber, CFBoolean и CFDate как значения атрибута. Если атрибут указан как многозначный, необходимо возвратить CFArray ожидаемого CFType.
Каковы импортированные атрибуты метаданных для определенного файла?
Можно определить атрибуты метаданных и значения в системном хранилище для файла при помощи mdls
команда:
mdls /Applications/iTunes.app |
/Applications/iTunes.app ------------- |
kMDItemAttributeChangeDate = 2005-01-16 03:03:14 -0500 |
kMDItemContentType = "com.apple.application-bundle" |
kMDItemContentTypeTree = ( |
"com.apple.application-bundle", |
"com.apple.application", |
"public.executable", |
"com.apple.bundle", |
"public.directory", |
"public.item", |
"com.apple.package" |
) |
kMDItemCopyright = "iTunes 4.7, Copyright 2000-2004 Apple Computer, Inc." |
kMDItemDisplayName = "iTunes" |
kMDItemFSContentChangeDate = 2005-01-08 18:17:52 -0500 |
kMDItemFSCreationDate = 2005-01-08 18:17:52 -0500 |
kMDItemFSCreatorCode = 0 |
kMDItemFSFinderFlags = 0 |
kMDItemFSInvisible = 0 |
kMDItemFSLabel = 0 |
kMDItemFSName = "iTunes.app" |
kMDItemFSNodeCount = 1 |
kMDItemFSOwnerGroupID = 80 |
kMDItemFSOwnerUserID = 0 |
kMDItemFSSize = 0 |
kMDItemFSTypeCode = 0 |
kMDItemID = 64286 |
kMDItemKind = "Application" |
kMDItemLastUsedDate = 2005-01-16 01:01:10 -0500 |
kMDItemUsedDates = ( |
2005-01-08 18:17:52 -0500, |
2005-01-13 19:00:00 -0500, |
2005-01-15 19:00:00 -0500 |
) |
kMDItemVersion = "4.7" |
Можно также указать определенный атрибут метаданных для возврата значения:
mdls -name kMDItemContentType /Applications/iTunes.app |
/Applications/iTunes.app ------------- |
kMDItemContentType = "com.apple.application-bundle" |
Почему Центр внимания не находящий мои пакеты документа, когда они сохраняются моим приложением?
Если Ваше приложение сохранило свои файлы как пакет, необходимо принять меры предосторожности, чтобы гарантировать, что Центр внимания не пытается импортировать пакет файла, прежде чем все данные будут записаны в пакет.
Посмотрите Пакеты Центра внимания и Документа для дополнительных подробных данных.