2011-08-12 3 views
5

私たちのiPadアプリはドキュメントを表示し、必要に応じてオフラインで保存できます。 私はそれらを表示するためにDocumentViewController(今からDVCという名前)という名前のQLPreviewControllerサブクラスを持っています。QuickLookでオフラインファイルを表示するにはどうすればよいですか?

アプリのワークフロー: - ユーザーがドキュメントの名前をクリックし、そのドキュメントを表示するためにDVCがプッシュされます。 - DVCはファイルをオフラインでダウンロードし、完了したら表示します。 (したがって、HTTP URLがダウンロードされ、オフラインで保存され、オフラインURLが返されます)

奇妙なことは、PDFファイルのみがオフラインURLで動作し、残りがクラッシュすることです私はいくつかのテストを行いました。オフラインリンクの前にfile://を置くと、アプリケーションはクラッシュしませんでしたが、DVCはファイルに関するいくつかの情報を表示しています(それはExcel 97-2004資料)。

情報の一部は転送されますが、問題の原因を特定できません。

ここにいくつかのスクリーンショットがあり、その後にいくつかのコードがあります。

enter image description here

コード:Documentは、ID、名前、ファイルの種類や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]]]; 
} 

もっとコードが必要な場合は、ちょうど言う。

編集:私はイメージをロードしようとするとPDFファイルが動作している

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

とのdocxない

URL渡さトラフ 'getDocumentFileAsPathWithDocument' メソッドをロギング(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は正常ですが、オフィスのファイルに「ドキュメントを読み取れません。ファイル形式が無効です」というメッセージが表示されます。 iWorksのドキュメントでは、Quicklookと同じエラーが発生します。私はそのフォーマットの保存と読み込みのどこかで、NSDATAとして保存しますが、それ以降は、例えばワードドキュメント(拡張子のみ)であるかどうかを確認するヒントはありません。

+0

[NSURL fileURLWithPath:...]を使用してみましたか?ファイルURLを処理する方法は非常に脆弱です。 – rbrown

+0

私はそれを "return [NSURL fileURLWithPath:fullPath];に変更しました。 (私は上記のコードを更新する)、私はまだ同じ問題があります。 – Justin

答えて

3

最終的にソリューションが見つかりました!

私はこの問題は、文書を保存したことが正しかったです。

私はに保存する方法を変更するために必要な:SO keyedarchiverでのファイルマネージャではなくて、それを保存

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

3

あなたのダウンロードコードはまだ投稿されていませんが、問題があると思います。ページからのファイル(.pages拡張子)は実際のファイルではなく、バンドルです。つまり、ファイルを含み、Finderで単一のアイテムとして表示されるディレクトリです(Finderで.pagesファイルを探して右クリックし、コンテンツを表示])。 .pagesファイルをダウンロードすることは、実際にはディレクトリをダウンロードするようなものです。ウェブサーバーによってどのような結果が得られますかは、エラーページの可能性が高いです。

あなたはそれが検出されました。ページファイルを作成し、その内容をすべて手動でダウンロードしようとしますが、ファイルの構造を調べて、Webサーバーからディレクトリの内容を要求することはできない可能性があるため、調べる必要があります。 .pptのと.XLSファイル用

結果は、私には正常に見えます。私はiPadがMS Officeのドキュメントをまったくプレビューできるとは思えない。

編集:謝罪、私はちょうどそれを読むiOS プレビューMS Officeドキュメント。ドキュメントがダウンロード中に何らかの形で破損する可能性がありますか?あなたのダウンロード場所をアプリのドキュメントフォルダに設定しようとしましたが、iTunesファイル共有を有効にしましたか?そうすれば、いくつかのドキュメントをダウンロードしてデバイスから取り出し、それをあなたのPCで開き、それが動作するかどうかを調べることができます。

+0

メッセージにダウンロード用のコードを追加しました。 (加えて、私はWebviewでそれをテストする編集) – Justin

0
  1. ファイルのサイズがオンラインとオフラインの両方で同じであるかどうかを確認しましたか?ファイルのダウンロードが

  2. のUIWebViewの通常NSURLオブジェクトと開口部とMS OfficeドキュメントのURLを使用してみてくださいを完了しなかった可能性があります。それがうまくいくのですか(ドキュメントかクラスか分かりますか?)

  3. はNSURLのfileURLWithPathを使用してみてください:getDocumentFileAsPathWithDocumentでの方法:URLが返されることがあるが正しくありません(ログからそれのようには見えませんが、試してみ害はありませんが)

+0

いいえwebviewは、ローカルURLのいずれかで動作しません。PDFは正常ですが、オフィスのファイルに「ドキュメントを読み取れません。ファイル形式が無効です」というメッセージが表示されます。 iWorksのドキュメントでは、Quicklookと同じエラーが発生します。私はそのフォーマットの保存と読み込みのどこかで、NSDATAとして保存しますが、それ以降は、例えばワードドキュメント(拡張子のみ)であるかどうかを確認するヒントはありません。それ以上のヒント? – Justin

+0

解決策を見つけたように見えますが、問題はファイルを保存していたためです。 – lostInTransit

0

まず、このコードを使用して文書がそこにあることを確認してください。なぜなら、文書パスによるエラーの原因と思われるからです。

NSFileManager *fileManager=[NSFileManager defaultManager]; 


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

     } 
0

1のいずれかの場合には、あなたが上記のすべての提案をしたにもかかわらず、同じ問題を抱えています。 (私はGoogleのドライブからいくつかのファイルをダウンロードしたとき、私は、同じ問題を抱えていた。)

これを試してみてください!ファイルの拡張子の

のPut「X」末端には、フォーマットの新しいバージョンとして認識されます。 (これは「doc」と「ppt」ファイルのみで、「xls」ファイルでは機能しません) はい、私はこれがこの問題を解決する適切な方法ではないことを知っていますが、 試してみる価値はあります。

私はすべてを試しました!

お手数ですが、

関連する問題