NSMetadataQuery игнорирует пользовательский тип файлового пакета

Я использую UIManagedDocument чтобы управлять моими файлами в iCloud. После настройки NSMetadataQuery вот так:

iCloudQuery = [[NSMetadataQuery alloc] init];
[iCloudQuery setSearchScopes:
    [NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]];
[iCloudQuery setPredicate:
    [NSPredicate predicateWithFormat:@"%K like %@", NSMetadataItemFSNameKey, @"DocumentMetadata.plist"]];

Я столкнулся с любопытной проблемой - когда мои документы называются без расширения файла (например, @"NewDocument2") или публичное расширение вроде .txt запрос метаданных правильно находит DocumentMetadata.plist файл. Однако при использовании моего собственного расширения файла запрос никогда ничего не находит... ни при запуске запроса, ни когда я добавляю новый документ.

Мне кажется, что запрос, вероятно, видит мой документ с его пользовательским расширением файла, не понимает, что это на самом деле каталог (во всяком случае, пакет файлов), и поэтому не заглядывает внутрь, чтобы найти DocumentMetadata.plist файл. Тем не менее, я объявил мой пользовательский UTI в приложении info.plist,

Возможно, я неправильно объявил свой UTI? Я следовал рекомендациям Apple (в Руководстве по программированию приложений на базе документов для iOS и обзоре унифицированных идентификаторов типов) при его создании, но, похоже, что-то не так.


Изменить: в разделе "Экспортированные ИМП" в info.plist мой тип соответствует com.apple.package.


Изменить: я все еще борюсь с этой проблемой. Сейчас я работаю над этим, не используя расширение файла.

При использовании пользовательского расширения файла я обрабатываю результаты запроса метаданных iCloud и DocumentMetadata.plist Файл определенно находится в пакете файла, но запрос метаданных не может его увидеть. При перечислении результатов запроса в журнал выводится следующее:

<iCloud Container URL>/Documents/
<iCloud Container URL>/Documents/New%20Document.spdoc/
<iCloud Container URL>/Documents/New%20Document.spdoc/DocumentMetadata.plist
<iCloud Container URL>/Documents/New%20Document.spdoc/StoreContent.nosync/
<iCloud Container URL>/Documents/New%20Document.spdoc/StoreContent.nosync/(A%20Document%20Being%20Saved%20By%20<AppName>%202)/
<iCloud Container URL>/Documents/New%20Document.spdoc/StoreContent.nosync/(A%20Document%20Being%20Saved%20By%20<AppName>)/
<iCloud Container URL>/Documents/New%20Document.spdoc/StoreContent.nosync/.persistentStore_SUPPORT/
<iCloud Container URL>/Documents/New%20Document.spdoc/StoreContent.nosync/.persistentStore_SUPPORT/_EXTERNAL_DATA/
<iCloud Container URL>/Documents/New%20Document.spdoc/StoreContent.nosync/persistentStore

(В каталоге "CoreDataLogs" также есть куча файлов, однако я не указал их здесь для краткости).

Я могу только думать, что эта проблема связана с неправильным созданием моего файлового пакета UTI. Кто-нибудь еще успешно использовал пользовательские пакеты файлов с iCloud? Это ошибка?

2 ответа

Решение

Это по замыслу.

API работает таким же образом и для Spotlight. Он не должен спускаться в пакетные документы, потому что содержимое этих документов в основном является частным. С iCloud это не имеет особого смысла, но я подозреваю, что они не будут его менять. API не имеет смысла работать двумя разными способами в зависимости от того, где он используется.

Я думаю, это историческая вещь - на Mac вы можете реализовать импортер Spotlight для обработки вашего пользовательского типа документа. На iOS пока не думаю, что это возможно (поправьте меня, если я ошибаюсь). Так что сейчас вам просто нужно обойти эту "особенность" API.

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

Обновитесь до iOS 5.1 beta 3 или новее. Я не верю, что UIManagedDocument + iCloud вообще работает в iOS 5.0.

Другие вопросы по тегам