Поиск и устранение неисправностей средств импорта центра внимания

Редкий проект, который безупречен от запуска. Поиск и устранение неисправностей средства импорта Центра внимания может быть трудным, учитывая, что он выполняется системой автоматически как требуется и выполняется вне среды разработки.

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

Где я должен установить свое средство импорта Центра внимания?

Средство импорта Центра внимания приложения находится в пакете приложения в подкаталоге 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. Необходимо проверить что:

  1. Тестовый файл является корректным типом файла.

  2. Тестовый файл имеет корректное расширение файла или набор типа файла.

  3. Если Ваше приложение объявляет, что 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>
  4. Гарантируйте, что Ваше приложение живет в расположении, где Launch Services может обнаружить отображения. Запуск приложения также гарантирует, что сделаны отображения.

mdimport не возвращает мои атрибуты метаданных

При выполнении mdimport с уровнем отладки 3 не перечисляет ни одного из Ваших пользовательских атрибутов метаданных, необходимо проверить что:

  1. Ваше средство импорта метаданных находится с помощью mdimport -L команда.

  2. Ваше средство импорта метаданных 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>
  3. UUID, который Вы создали для своего средства импорта, уникален и находится в обоих CFPlugInFactories и CFPluginTypes записи средства импорта Info.plist файл. Здесь, UUID 8AED83B3-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>
  4. У Вас есть корректный тип 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>
  5. Ваш UTI является всем нижним регистром в Info.plist и schema.xml файлы.

  6. Если Ваше средство импорта читает метаданные из пакета файла, гарантируйте что UTTypeConformsTo запись в средстве импорта Info.plist файл включает com.apple.package как файл UTI.

  7. Ваш 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.
  8. Ваша реализация GetMetadataForFile заполняет словарь с корректными записями метаданных и возвращается true.

  9. Вы возвращаете только 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"

Почему Центр внимания не находящий мои пакеты документа, когда они сохраняются моим приложением?

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

Посмотрите Пакеты Центра внимания и Документа для дополнительных подробных данных.