如何让QuickLook显示脱机文件?

Jus*_*tin 5 iphone offline objective-c ipad ios

我们的iPad应用程序可以显示文档并在需要时将其保存在线下 我有一个名为DocumentViewController的QLPreviewController子类(从现在起名为DVC)来显示它们.

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

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

我做了一些测试,当我把文件://放在离线链接之前,应用程序没有崩溃,但DVC给我提供了一些关于文件的信息(就像它是一个excel 97-2004文档).

所以一些信息被转移,但我无法弄清楚问题是什么.

这里有一些截图,然后是一些代码.

在此输入图像描述

代码: 请注意,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]]];
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:

记录通过'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
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)

编辑:

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

Jus*_*tin 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;
}
Run Code Online (Sandbox Code Playgroud)

因此,使用文件管理器而不是密钥归档器保存它。