如何让QuickLook显示脱机文件?

时间:2011-08-12 09:54:30

标签: iphone objective-c ios ipad offline

我们的iPad应用可以显示文档并在需要时将其保存为脱机状态。 我有一个名为DocumentViewController的QLPreviewController子类(从现在起名为DVC),用于显示它们。

应用的工作流程: - 用户单击文档的名称并按下DVC以显示文档。 - DVC离线下载文件并在完成后显示。   (因此,下载HTTP URL,脱机存储,并返回脱机URL)

奇怪的是,只有PDF文件正在使用脱机URL,其余的崩溃..(虽然它适用于在线链接)

我做了一些测试,当我在离线链接之前放置file://应用程序没有崩溃但是DVC正在告诉我有关该文件的一些信息(就像它是excel 97-2004文档)。

所以传递了一些信息,但我无法弄清问题是什么。

以下是一些截图,然后是一些代码。

enter image description here

代码: 请注意,Document是一个模型类,其文档属性包括id,name,file type和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]]];
}

如果需要更多代码,请说。

编辑:

当记录通过'getDocumentFileAsPathWithDocument'方法传递的URL时:

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

PDF文件正常工作且docx不是

当我尝试从本地存储加载图像(jpg)时,出现此错误消息的黑屏:

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.

编辑:

webview无法使用本地网址。 PDF很好,但办公室文件给出了一条消息“无法读取文档,文件格式无效”。 iWorks文档提供与quicklook相同的错误。我认为它在格式的保存和加载的某处,我把它们当作NSDATA,但之后没有提示让iPad看它是否是例如word文档(只是扩展名)。

5 个答案:

答案 0 :(得分:3)

您尚未发布下载代码,但我相信存在问题。来自Pages(.pages扩展名)的文件不是实际文件,它们是 bundles ,即包含文件并在Finder中显示为单个项目的目录(在Finder中查找.pages文件,右键 - 单击它并选择“显示内容”)。下载.pages文件实际上就像下载一个目录:它取决于Web服务器你获得了什么样的结果,但它很可能是一个错误页面。

您可以检测到它是.pages文件并尝试手动下载其所有内容,但您必须研究文件的结构以查看是否可能,因为您不太可能请求其中的内容来自Web服务器的目录。

.ppt和.xls文件的结果对我来说是正常的;我认为iPad根本不可能预览MS Office文档。

编辑:道歉,我刚刚读到iOS 可以预览MS Office文档。在下载过程中,文档可能会以某种方式损坏?您是否尝试将下载位置设置为应用程序的文档文件夹并启用iTunes文件共享?通过这种方式,您可以下载一些文档,将它们从设备中取出然后尝试在PC上打开它,看看是否有效。

答案 1 :(得分:3)

我们终于找到了解决方案!

我认为问题在于保存文档。

我需要更改以下方法中的保存方法:

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

使用filemanager保存它,而不是使用keyedarchiver保存它。

答案 2 :(得分:0)

  1. 您是否检查过在线和离线文件的大小是否相同?文件下载可能不完整

  2. 尝试使用具有普通NSURL对象的MS Office文档的URL并在UIWebView中打开。它是否有用(所以我们知道它的文件或你的班级)?

  3. 尝试在getDocumentFileAsPathWithDocument中使用NSURL的fileURLWithPath:方法:返回的URL可能不正确(虽然从日志中看起来不像,但尝试没有伤害)

    < / LI>

答案 3 :(得分:0)

首先,使用此代码确保您的文档存在,因为我认为错误是由文档路径引起的。

NSFileManager *fileManager=[NSFileManager defaultManager];


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

        }

答案 4 :(得分:0)

即使你做了上面的所有建议,如果其中任何一个都有同样的问题。 (当我从谷歌驱动器下载一些文件时,我遇到了同样的问题。)

试试这个!

将文件扩展名的“x”结尾视为新版本的格式。 (它仅适用于'doc'和'ppt'文件,不适用于'xls'文件) 是的,我知道这不是解决这个问题的合适方法,但是 值得尝试一下。

相信我,我尝试了一切!

希望你能帮忙。