2011-08-12 3 views
5

Notre application iPad peut afficher des documents et les enregistrer hors ligne en cas de besoin. J'ai une sous-classe QLPreviewController nommée DocumentViewController (nommée DVC à partir de maintenant) pour les montrer.Comment obtenir QuickLook pour afficher les fichiers hors-ligne?

Flux de travail de l'application: - L'utilisateur clique sur le nom d'un document et le DVC est activé pour afficher le document. - Le DVC télécharge le fichier hors ligne et le montre une fois terminé. (Ainsi l'URL HTTP est téléchargée, stockée hors ligne, et une URL hors ligne est renvoyée)

La chose étrange est, est que seuls les fichiers PDF fonctionnent avec l'URL hors ligne, et le reste se bloque .. (il fonctionne avec j'ai fait quelques tests et quand je mets le fichier: // avant le lien hors ligne l'application ne plante pas mais le DVC me donne quelques informations sur le fichier (comme si c'était un excellent 97-2004 document).

Donc, certaines informations sont transférées, mais je n'arrive pas à comprendre quel est le problème.

Voici quelques captures d'écran et ensuite du code.

enter image description here

code: Notez que le document est une classe de modèle avec des propriétés de document comme id, nom, type de fichier et 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 plus de code nécessaire, dites.

EDIT:

Lorsque vous vous connectez l'URL auge passé la méthode '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 

Lorsque le fichier PDF fonctionne et les docx ne

Lorsque je tente de charger une image (jpg) du stockage local je reçois un écran noir avec ce message d'erreur:

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. 

EDIT:

Le webview ne fonctionne pas avec les URL locales. PDF est bien, mais les fichiers Office donne un message "Impossible de lire le document, le format de fichier est invalide". Les documents iWorks donnent la même erreur que le quicklook. Je pense que c'est quelque part à la sauvegarde et la charge du format, je les sauvegarde comme un NSDATA mais après cela il n'y a pas d'indice pour l'iPad pour voir si c'est par exemple un document Word (seulement l'extension).

+0

Avez-vous essayé d'utiliser [NSURL fileURLWithPath: ...]? La façon dont vous gérez les URL de fichiers est très fragile. – rbrown

+0

Je l'ai changé pour "retourner [NSURL fileURLWithPath: fullPath];" (Je mets à jour le code ci-dessus pour), mais j'ai toujours le même problème. – Justin

Répondre

3

Nous avons finalement trouvé la solution!

J'avais raison de dire que le problème résidait dans l'enregistrement du document.

je devais changer la méthode sauver: sauver

+ (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; 
} 

SO avec le gestionnaire de fichiers et non avec un keyedarchiver.

3

Vous n'avez pas posté votre code de téléchargement, mais je crois que le problème est là. Les fichiers de Pages (.pages extension) ne sont pas des fichiers réels, ils sont paquets, c'est à dire les répertoires qui contiennent des fichiers et s'affichent comme un seul élément dans Finder (recherchez un fichier .pages dans le Finder, cliquez dessus avec le bouton droit de la souris Afficher le contenu '). Le téléchargement d'un fichier .pages est en fait comme le téléchargement d'un répertoire: cela dépend du serveur Web quel genre de résultat vous obtenez, mais c'est probablement une page d'erreur.

Vous pouvez détecter que c'est un.pages et essayer de télécharger tout son contenu manuellement, mais vous devrez étudier la structure des fichiers pour voir si c'est possible, car il est peu probable que vous pouvez demander le contenu du répertoire à partir d'un serveur Web.

Les résultats pour les fichiers .ppt et .xls me semblent normaux; Je pense qu'il est peu probable que l'iPad puisse prévisualiser les documents MS Office.

Éditer: excuses, je viens de lire que iOS peut documents MS Office de prévisualisation. Peut-être que les documents sont corrompus pendant le téléchargement? Avez-vous essayé de définir votre position de téléchargement dans le dossier des documents de l'application et d'activer le partage de fichiers iTunes? De cette façon, vous pouvez télécharger des documents, les retirer de votre appareil, puis essayez de l'ouvrir sur votre PC pour voir si cela fonctionne.

+0

J'ai ajouté du code pour le téléchargement dans mon message. (plus un edit, où je le teste avec un webview) – Justin

0
  1. Avez-vous vérifié si la taille des fichiers est la même en ligne et hors ligne? Il est possible que le téléchargement du fichier n'ait pas été terminé

  2. Essayez d'utiliser l'URL des documents MS Office avec un objet NSURL normal et de l'ouvrir dans un UIWebView. Est-ce que ça marche alors (donc on sait si c'est le document ou votre classe)?

  3. Essayez d'utiliser fileURLWithPath de NSURL: méthode dans le getDocumentFileAsPathWithDocument: Il est possible que l'URL renvoyée est incorrect (mais ne ressemble pas à partir des journaux, mais ne fait pas de mal à essayer)

+0

Non le webview ne fonctionne pas non plus avec les URL locales.PDF est bien, mais les fichiers Office donne un message "Impossible de lire le document, le format de fichier est invalide". Les documents iWorks donnent la même erreur que le quicklook. Je pense que c'est quelque part à la sauvegarde et la charge du format, je les sauvegarde comme un NSDATA mais après cela il n'y a pas d'indice pour l'iPad pour voir si c'est par exemple un document Word (seulement l'extension). d'autres conseils? – Justin

+0

On dirait que vous avez trouvé la solution et le problème était avec l'enregistrement du fichier. – lostInTransit

0

tout d'abord, utilisez ce code pour vous assurer que vos documents sont là, car je pense que l'erreur cause par le chemin de vos documents.

NSFileManager *fileManager=[NSFileManager defaultManager]; 


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

     } 
0

Si l'un d'eux a le même problème, même si vous avez fait toutes les suggestions ci-dessus. (J'ai eu le même problème, lorsque j'ai téléchargé des fichiers de google drive.)

Essayez ceci!

Mettez la fin 'x' de votre extension de fichier pour être reconnue comme une nouvelle version du format. (il ne fonctionne que pour les fichiers 'doc' et 'ppt', pas pour les fichiers 'xls') Oui, je sais que ce n'est pas un moyen approprié de résoudre ce problème, mais il vaut la peine de l'essayer.

Croyez-moi, j'ai tout essayé!

J'espère que vous m'aidez.

Questions connexes