2012-01-26 20 views
6

Estoy usando UIManagedDocument s para administrar mis archivos en iCloud. Después de configurar la NSMetadataQuery así:NSMetadataQuery ignorando el paquete de archivos personalizado tipo

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

Estoy encontrando un problema curioso - cuando mis documentos se nombran sin una extensión de archivo (por ejemplo @"NewDocument2") o una extensión pública como .txt, la consulta de metadatos encuentra correctamente el DocumentMetadata.plist archivo. Sin embargo, cuando uso mi extensión de archivo personalizada, la consulta nunca encuentra nada ... no cuando se inicia la consulta, ni cuando agrego un documento nuevo.

Me parece que la consulta está viendo probablemente mi documento con su extensión de archivo personalizado, es no darse cuenta de que es, de hecho, un directorio (un paquete de archivos en todo caso), por lo que no se ve dentro para encontrar el archivo DocumentMetadata.plist. Sin embargo, he declarado mi UTI personalizada en la aplicación info.plist.

Quizás he declarado mi UTI incorrectamente? Seguí las pautas de Apple (en Document-Based App Programming Guide for iOS y Uniform Type Identifiers Overview) al crearlo, pero parece que algo anda mal.


Editar: Bajo 'UTI exportado' en el info.plist, mi tipo se fija para ajustarse a 'com.apple.package'.


Editar: todavía estoy luchando con este problema. Estoy trabajando en esto por ahora al no usar una extensión de archivo.

Al usar la extensión de archivo personalizada, estoy procesando los resultados de la consulta de metadatos de iCloud y el archivo DocumentMetadata.plist está definitivamente dentro del paquete de archivos, pero la consulta de metadatos no puede verlo. Al enumerar los resultados de la consulta, la siguiente se imprime en el registro:

<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 

(También hay un montón de archivos en un directorio "CoreDataLogs", sin embargo no les haya mostrado aquí por razones de brevedad).

Solo puedo pensar que este problema tiene que ver con la creación incorrecta de mi paquete de archivos UTI. ¿Alguien más ha utilizado con éxito paquetes de archivos personalizados con iCloud? ¿Es esto un error?

+1

Todavía estoy luchando con el dolor de UIManagedDocument. Esta no es realmente una respuesta, pero es posible que desee considerar almacenar UIManagedDocuments fuera de la carpeta "Documentos". De lo contrario, cuando el usuario vaya a Configuración-> iCloud-> Almacenamiento y respaldo-> Administrar almacenamiento->, verá las entradas de DocumentMetadata.plist. Puse mis documentos en una carpeta separada al mismo nivel que Documentos. Entonces su consulta debería usar NSMetadataQueryUbiquitousDataScope. No estoy seguro si necesitaría una extensión de archivo, o si tiene sentido en este caso. – Daniel

Respuesta

3

Esto es por diseño.

La API funciona de esta manera también para Spotlight. No debe descender a los documentos del paquete porque el contenido de esos documentos es básicamente privado. Con iCloud, esto no tiene mucho sentido, pero sospecho que no lo van a cambiar. No tendría sentido que la API funcione de dos formas diferentes según el lugar en que se use.

Supongo que esto es algo histórico: en Mac puede implementar un importador de Spotlight para manejar su tipo de documento personalizado. En iOS, no creo que esto sea posible todavía (corríjanme si me equivoco). Entonces, por ahora, solo tienes que trabajar en torno a esta 'característica' de la API.

Puede buscar el documento en su lugar y luego solo obtener los metadatos desde allí. De lo contrario, encadene la extensión como lo ha hecho debería funcionar.

1

Actualice a iOS 5.1 beta 3 o posterior. No creo que UIManagedDocument + iCloud funcione en iOS 5.0.

+0

En realidad, actualicé recientemente a la última versión beta de la versión 5.1, pero volví muy rápidamente a la versión 5.0 debido a un código increíblemente frustrante de plegado/sangría de código en la vista previa actual de Xcode 4.3. Mientras usaba la versión beta más reciente, este problema con el paquete de archivos todavía estaba presente. – Stuart

Cuestiones relacionadas