NSMetadataQuery игнорирует пользовательский тип файлового пакета - PullRequest
6 голосов
/ 27 января 2012

Я использую UIManagedDocument s для управления своими файлами в 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 и Обзор унифицированных идентификаторов типов ) при его создании, но, похоже, что-то не так.


Редактировать: В разделе «Экспортированные UTI» в 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 ]

3 голосов
/ 02 мая 2012

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

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

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

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

1 голос
/ 16 февраля 2012

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

...