我们的iPad应用可以显示文档并在需要时将其保存为脱机状态。 我有一个名为DocumentViewController的QLPreviewController子类(从现在起名为DVC),用于显示它们。
应用的工作流程: - 用户单击文档的名称并按下DVC以显示文档。 - DVC离线下载文件并在完成后显示。 (因此,下载HTTP URL,脱机存储,并返回脱机URL)
奇怪的是,只有PDF文件正在使用脱机URL,其余的崩溃..(虽然它适用于在线链接)
我做了一些测试,当我在离线链接之前放置file://应用程序没有崩溃但是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]]];
}
如果需要更多代码,请说。
编辑:
当记录通过'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文档(只是扩展名)。
答案 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)
您是否检查过在线和离线文件的大小是否相同?文件下载可能不完整
尝试使用具有普通NSURL对象的MS Office文档的URL并在UIWebView中打开。它是否有用(所以我们知道它的文件或你的班级)?
尝试在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'文件) 是的,我知道这不是解决这个问题的合适方法,但是 值得尝试一下。
相信我,我尝试了一切!
希望你能帮忙。