2011-08-12 13 views
5

Nuestra aplicación para iPad puede mostrar documentos y guardarlos fuera de línea cuando sea necesario. Tengo una subclase QLPreviewController llamada DocumentViewController (llamada a partir de ahora DVC) para mostrarlas.¿Cómo obtengo QuickLook para mostrar los archivos sin conexión?

Flujo de trabajo de la aplicación: - El usuario hace clic en el nombre de un documento y el DVC se presiona para mostrar el documento. - DVC descarga el archivo fuera de línea y lo muestra cuando haya terminado. (Por lo tanto, la URL HTTP se descarga, se almacena sin conexión y se devuelve una URL sin conexión)

Lo extraño es que solo los archivos PDF funcionan con la URL sin conexión y el resto falla ... (funciona con enlaces en línea)

Hice algunas pruebas y cuando coloque el archivo: // antes del enlace sin conexión, la aplicación no falla, pero el DVC me está dando cierta información sobre el archivo (como que es un excel 97-2004 documento).

Así que se transfiere algo de información, pero no puedo entender cuál es el problema.

Aquí hay algunas capturas de pantalla y, a continuación, algunos códigos.

enter image description here

código: Nota que el documento es una clase del modelo con las propiedades del documento como la identificación, nombre, tipo de archivo y URL.

//DVC QLPreviewController dataSource method for returning url 
- (id <QLPreviewItem>) previewController: (QLPreviewController *) controller previewItemAtIndex: (NSInteger)index 
{ 
    [SaveHelper saveDocumentFileAndPropertyWithDocument:document]; 

    //[SaveHelper getDocumentFileWithDocument:document]; without file:// 
    //if I return document.documentUrl it is working with all files except iworks files) 
    return [SaveHelper getDocumentFileAsPathWithDocument:document]; //with file:// 
} 

//SaveHelper methods 
+ (NSString *)documentFilePathWithDocument:(Document *)document 
{ 
    return [[self documentFilePath] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@%d.%@", DOCUMENT_FILE_PREFIX, document.documentId, document.documentType]]; 
} 

+ (NSURL *)saveDocumentFileAndPropertyWithDocument:(Document *)document 
{ 
    if([self saveDocumentPropertyWithDocument:document]) 
    { 
     return [self saveDocumentFileWithDocument:document]; 
    } 

    return nil; 
} 

+ (NSURL *)saveDocumentFileWithDocument:(Document *)document 
{ 
    NSData *data = [NSData dataWithContentsOfURL:document.documentURL]; 

    NSString *fullPath = [self documentFilePathWithDocument:document]; 

    if([[NSKeyedArchiver archivedDataWithRootObject:data] writeToFile:fullPath atomically:YES]) 
    { 
     return [NSURL fileURLWithPath:fullPath]; 
    } 

    return nil; 
} 

+ (NSURL *)getDocumentFileWithDocument:(Document *)document 
{ 
    return [NSURL fileURLWithPath:[self documentFilePathWithDocument:document]]; 
} 

+ (NSURL *)getDocumentFileAsPathWithDocument:(Document *)document 
{ 
    return [NSURL fileURLWithPath:[@"file://" stringByAppendingPathComponent:[[self getDocumentFileWithDocument:document] absoluteString]]]; 
} 

Si necesita más código, solo diga.

EDIT:

Al registrar la URL a través transcurrido el método 'getDocumentFileAsPathWithDocument':

url: file:/var/mobile/Applications/xx-xx/Documents/documentFiles/file_20.pdf 
url: file:/var/mobile/Applications/xx-xx/Documents/documentFiles/file_80.docx 

Si el archivo PDF está funcionando y los docx no

Cuando intento cargar una imagen (jpg) desde el almacenamiento local Aparece una pantalla en negro con este mensaje de error:

warning: Unable to read symbols for /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.3.5 (8L1)/Symbols/System/Library/Frameworks/QuickLook.framework/DisplayBundles/Image.qldisplay/Image (file not found). 
warning: No copy of Image.qldisplay/Image found locally, reading from memory on remote device. This may slow down the debug session. 

EDITAR:

La vista web no funciona con las direcciones URL locales. PDF está bien, pero los archivos de Office dan un mensaje "No se puede leer el documento, el formato de archivo no es válido". Los documentos de iWorks dan el mismo error que el quicklook. Creo que es en algún lugar en el guardado y la carga del formato, los guardo como un NSDATA pero después de eso no hay ninguna pista para el iPad para ver si es, por ejemplo, un documento de Word (solo la extensión).

+0

¿Ha intentado utilizar [NSURL fileURLWithPath: ...]? La forma en que maneja las URL de los archivos es muy frágil. – rbrown

+0

Lo he cambiado a "return [NSURL fileURLWithPath: fullPath];" (Actualizo el código de arriba a), pero todavía tengo el mismo problema. – Justin

Respuesta

3

¡Finalmente hemos encontrado la solución!

Tenía razón en que el problema era guardar el documento.

que tenía que cambiar el método de salvamento en:

+ (NSURL *)saveDocumentFileWithDocument:(Document *)document 
{ 
    NSData *data = [NSData dataWithContentsOfURL:document.documentURL options:NSDataReadingUncached error:nil]; 

    NSString *fullPath = [self documentFilePathWithDocument:document]; 

    if([[NSFileManager defaultManager] createFileAtPath:fullPath contents:data attributes:nil]) 
    { 
     return [NSURL fileURLWithPath:fullPath]; 
    } 
//OLD CODE 
// if([[NSKeyedArchiver archivedDataWithRootObject:data] writeToFile:fullPath atomically:YES]) 
// { 
//  return [NSURL fileURLWithPath:fullPath]; 
// } 

    return nil; 
} 

lo que el ahorro con el administrador de archivos y no con una keyedarchiver.

3

No ha publicado su código de descarga, pero creo que el problema está ahí. Los archivos de las páginas (extensión .pages) no son archivos reales, son paquetes, es decir, directorios que contienen archivos y se muestran como un único elemento en Finder (busque un archivo .pages en Finder, haga clic con el botón derecho y seleccione ' Mostrar contenidos '). La descarga de un archivo .pages es en realidad como descargar un directorio: depende del servidor web qué tipo de resultado obtenga, pero lo más probable es que sea una página de error.

Puedes detectar que es a.páginas y trate de descargar todo su contenido manualmente, pero tendría que estudiar la estructura de los archivos para ver si eso es posible porque es poco probable que pueda solicitar los contenidos del directorio desde un servidor web.

Los resultados de los archivos .ppt y .xls me parecen normales; Creo que es poco probable que el iPad pueda obtener una vista previa de los documentos de MS Office.

Edición: disculpas, acabo de leer que iOS puede vista previa documentos de MS Office. Tal vez los documentos se corrompan de alguna manera durante la descarga? ¿Has intentado configurar tu ubicación de descarga en la carpeta de documentos de la aplicación y habilitar el uso compartido de archivos de iTunes? De esta forma, puede descargar algunos documentos, sacarlos de su dispositivo y luego intentar abrirlos en su PC para ver si eso funciona.

+0

Agregué un código para la descarga en mi mensaje. (más una edición, donde lo pruebo con una vista web) – Justin

0
  1. ¿Comprobó si el tamaño de los archivos es el mismo tanto en línea como fuera de línea? Es posible que la descarga del archivo no se haya completado

  2. Intente utilizar la URL de los documentos de MS Office con un objeto NSURL normal y la apertura en un UIWebView. ¿Funciona entonces (para saber si es el documento o su clase)?

  3. Trate de usar fileURLWithPath de NSURL: método en el getDocumentFileAsPathWithDocument: Es posible que la URL de ser devuelto es incorrecto (aunque no parece que a partir de los registros, pero no se pierde nada con probar)

+0

No la vista web tampoco funciona con las URL locales.PDF está bien, pero los archivos de Office dan un mensaje "No se puede leer el documento, el formato de archivo no es válido". Los documentos de iWorks dan el mismo error que el quicklook. Creo que es en algún lugar en el guardado y la carga del formato, los guardo como un NSDATA pero después de eso no hay ninguna pista para el iPad para ver si es, por ejemplo, un documento de Word (solo la extensión). cualquier otro consejo? – Justin

+0

Parece que encontró la solución y el problema fue guardar el archivo. – lostInTransit

0

en primer lugar, use este código para asegurarse de que sus documentos estén allí, porque creo que el error se debe a la ruta de su documento.

NSFileManager *fileManager=[NSFileManager defaultManager]; 


     if([fileManager fileExistsAtPath:fullPath]){ 
      NSLog(@"%@ exsit! ",fullPath); 
     }else{ 
      NSLog(@"%@ not exsit! ",fullPath); 

     } 
0

Si alguno de ellos tiene el mismo problema aunque haya hecho todas las sugerencias anteriores. (tuve el mismo problema, cuando descargué algunos archivos de la unidad de google.)

¡Pruebe esto!

Ponga 'x' al final de su extensión de archivo para que se reconozca como una nueva versión del formato. (funciona solo para archivos 'doc' y 'ppt', no para archivos 'xls') Sí, sé que esta no es una forma adecuada de resolver este problema, pero vale la pena intentarlo.

Créeme Probé todo!

Espero que ayudes.

Cuestiones relacionadas