Iphone 如何让QuickLook显示脱机文件?

Iphone 如何让QuickLook显示脱机文件?,iphone,objective-c,ios,ipad,offline,Iphone,Objective C,Ios,Ipad,Offline,我们的iPad应用程序可以显示文档并在需要时离线保存。 我有一个名为DocumentViewController(从现在起名为DVC)的QLPreviewController子类来显示它们 应用程序的工作流程: -用户单击文档的名称,然后按下DVC以显示文档。 -DVC离线下载文件,并在完成后显示。 (因此HTTP URL被下载、离线存储,并返回一个离线URL) 奇怪的是,只有PDF文件与脱机URL一起工作,其余文件崩溃。。(不过它可以与在线链接一起使用) 我做了一些测试,当我将file://放

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

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

奇怪的是,只有PDF文件与脱机URL一起工作,其余文件崩溃。。(不过它可以与在线链接一起使用)

我做了一些测试,当我将file://放在脱机链接之前时,应用程序没有崩溃,但DVC正在向我提供有关该文件的一些信息(比如它是一个excel 97-2004文档)

所以一些信息被传输了,但我不知道问题出在哪里

这里是一些截图和之后的一些代码

代码: 请注意,Document是一个模型类,具有id、名称、文件类型和url等文档属性

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也不适用于本地URL。PDF可以,但office文件会显示一条消息“无法读取文档,文件格式无效”。iWorks文档给出了与quicklook相同的错误。我认为这是格式保存和加载的地方,我将它们保存为NSDATA,但在此之后,没有提示iPad查看它是否是word文档(仅是扩展名)。

您还没有发布下载代码,但我相信问题就在那里。页面(.Pages extension)中的文件不是实际的文件,而是捆绑包,即包含文件并在Finder中显示为单个项目的目录(在Finder中查找.Pages文件,右键单击它并选择“显示内容”)。下载一个.pages文件实际上就像下载一个目录:这取决于web服务器您得到的结果,但很可能是一个错误页面

您可以检测到它是一个.pages文件,并尝试手动下载它的所有内容,但您必须研究文件的结构,看看这是否可行,因为您不太可能从web服务器请求目录的内容

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

编辑:抱歉,我刚读到iOS可以预览MS Office文档。也许文档在下载过程中被破坏了?您是否尝试将下载位置设置为应用程序的“文档”文件夹并启用iTunes文件共享?通过这种方式,你可以下载一些文档,将它们从你的设备上取下,然后尝试在你的电脑上打开,看看是否有效

  • 您是否检查了文件的大小在线和离线是否相同?文件下载可能未完成

  • 尝试将MS Office文档的URL与普通NSURL对象一起使用,并在UIWebView中打开。那么它能工作吗(所以我们知道它是文档还是你的类)

  • 尝试在getDocumentFileAsPathWithDocument中使用NSURL的fileURLWithPath:方法:返回的URL可能不正确(虽然与日志中的不一样,但尝试也不会有什么坏处)


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

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

    我们终于找到了解决办法

    我是对的,问题在于保存文档

    我需要在中更改保存方法:

    + (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保存它。

    如果其中任何一个存在相同的问题,即使您完成了上述所有操作。 (当我从谷歌硬盘下载一些文件时,我也遇到了同样的问题。)

    试试这个

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

    相信我,我什么都试过了


    希望您能提供帮助。

    您是否尝试过使用[NSURL fileURLWithPath:…]呢?您处理文件URL的方式非常脆弱。我已将其更改为“return[NSURL fileURLWithPath:fullPath];”(我将上面的代码更新为),但我仍然遇到相同的问题。不,webview也不能处理本地URL。PDF可以,但office文件会显示一条消息“无法读取文档,文件格式无效”。iWorks文档给出了与quicklook相同的错误。我认为它是在保存和加载格式的某个地方,我将它们保存为NSDATA,但在这之后,没有提示iPad查看它是否是word文档(仅扩展名)。还有其他提示吗?看起来您找到了解决方案,问题在于保存文件。我在邮件中添加了一些下载代码。(加上编辑,我用webview测试它)
    NSFileManager *fileManager=[NSFileManager defaultManager];
    
    
            if([fileManager fileExistsAtPath:fullPath]){
                NSLog(@"%@  exsit! ",fullPath);
            }else{
                NSLog(@"%@  not exsit! ",fullPath);
    
            }
    
    + (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;
    }