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.