2011-08-12 3 views
5

iPad 앱은 필요할 때 문서를 표시하고 오프라인으로 저장할 수 있습니다. 나는 그것을 보여주기 위해 DocumentViewController라는 이름의 QLPreviewController 서브 클래스를 가지고있다.QuickLook에서 오프라인 파일을 표시하려면 어떻게합니까?

응용 프로그램의 워크 플로 : - 사용자가 문서의 이름을 클릭하고 DVC가 눌러져 문서를 표시합니다. - DVC는 파일을 오프라인에서 다운로드하고 완료되면 보여줍니다. (따라서 HTTP URL이 다운로드되고 오프라인으로 저장되며 오프라인 URL이 반환됩니다.)

이상한 것은 PDF 파일 만 오프라인 URL로 작업하고 나머지는 충돌한다는 것입니다. 온라인 링크)

나는 몇 가지 테스트를했는데 오프라인 연결 전에 file : //을 넣을 때 응용 프로그램이 충돌하지 않지만 DVC가 파일에 대한 정보를 제공합니다 (예 : 97-2004 문서).

일부 정보는 전송되지만 문제가 무엇인지 파악할 수 없습니다.

다음은 일부 스크린 샷과 그 이후의 코드입니다.

enter image description here

코드 : 문서는 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]]]; 
} 

더 많은 코드가 필요하면 그냥 말해보세요.

편집 :

URL을 전달 트로프에게 'getDocumentFileAsPathWithDocument'방법 로그인 : 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을하지

나는 이미지를로드 할 때 (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. 

편집 :

웹보기가 로컬 URL에서 작동하지 않습니다. PDF는 정상이지만 사무실 파일에 "문서를 읽을 수 없습니다. 파일 형식이 잘못되었습니다"라는 메시지가 나타납니다. iWorks 문서는 quicklook과 동일한 오류를 나타냅니다. 나는 그것의 어딘가에 형식의 저장 및로드를 생각하고 NSDATA로 저장하지만 그 후에는 iPad가 워드 문서 (예 : 확장자)인지 여부에 대한 힌트가 없습니다.

+0

[NSURL fileURLWithPath : ...]을 (를) 사용해 보셨나요? 파일 URL을 처리하는 방식은 매우 약합니다. – rbrown

+0

"return [NSURL fileURLWithPath : fullPath];"로 변경했습니다. (위의 코드를 업데이트합니다.)하지만 여전히 동일한 문제가 있습니다. – Justin

답변

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

는 그래서 파일 관리자와 아닌 keyedarchiver로 저장 :

나는에 저장 방법을 변경했습니다.

3

다운로드 코드를 게시하지 않았지만 문제가 있다고 생각됩니다. 페이지 (.pages 확장자)의 파일은 실제 파일이 아니며 번들입니다. 즉, 파일이 있고 Finder에서 단일 항목으로 표시되는 디렉토리 (Finder에서 .pages 파일을 찾아 마우스 오른쪽 버튼으로 클릭하고 ' 내용보기 '). .pages 파일을 다운로드하는 것은 실제로 디렉토리를 다운로드하는 것과 같습니다. 웹 서버에 따라 어떤 결과가 나오지만 오류 페이지 일 가능성이 큽니다.

그걸 감지 할 수 있습니다.pages 파일을 다운로드하고 모든 내용을 수동으로 다운로드하려고 시도하지만 파일 구조를 연구하여 웹 서버에서 디렉토리의 내용을 요청할 가능성이 낮기 때문에 가능한지 확인해야합니다.

.ppt 및 .xls 파일의 결과는 정상적으로 보입니다. 나는 iPad가 MS Office 문서를 전혀 미리 볼 수 없다고 생각합니다.

편집 : 사과, 방금 iOS 수 있습니다 미리보기 MS Office 문서. 아마도 다운로드하는 동안 문서가 어떻게 든 손상 될 수 있습니까? 다운로드 위치를 앱의 문서 폴더로 설정하고 iTunes 파일 공유를 사용하려고 했습니까? 그렇게하면 일부 문서를 다운로드하여 장치에서 꺼내 PC에서 열어보고 작동하는지 확인할 수 있습니다.

+0

내 메시지에 다운로드 할 코드를 추가했습니다. (플러스 편집, webview로 테스트) – Justin

0
  1. 파일의 크기가 온라인과 오프라인이 같은지 확인 했습니까? 파일 다운로드가 완료되지 않았을 수 있습니다.

  2. 일반 NSURL 개체가있는 MS Office 문서의 URL을 사용하고 UIWebView에서여십시오. 그 때 작동합니까 (그래서 우리는 문서 또는 클래스인지 알 수 있습니까?)

  3. NSURL의 fileURLWithPath 사용해보십시오 : 방법을 getDocumentFileAsPathWithDocument에 : 그것은 가능하다 반환되는 URL이 (로그에서처럼 보이지 않는하지만하지만 시도 다치게하지 않습니다) 잘못된 것을

+0

아니요 webview가 로컬 URL과 함께 작동하지 않습니다.PDF는 정상이지만 사무실 파일에 "문서를 읽을 수 없습니다. 파일 형식이 잘못되었습니다"라는 메시지가 나타납니다. iWorks 문서는 quicklook과 동일한 오류를 나타냅니다. 나는 그것의 어딘가에 형식의 저장 및로드를 생각하고 NSDATA로 저장하지만 그 후에는 iPad가 워드 문서 (예 : 확장자)인지 여부에 대한 힌트가 없습니다. 더 이상의 팁? – Justin

+0

솔루션을 찾은 것처럼 보이고 파일을 저장하는 데 문제가있는 것 같습니다. – lostInTransit

0

먼저이 코드를 사용하여 문서 경로에 오류가 있다고 생각하기 때문에 문서가 있는지 확인하십시오.

NSFileManager *fileManager=[NSFileManager defaultManager]; 


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

     } 
0

위의 모든 제안을 했더라도 동일한 문제가있는 사람이있는 경우 (Google 드라이브에서 파일을 다운로드 할 때도 동일한 문제가 발생했습니다.)

시도해보십시오.

파일 확장자의 'x'끝을 새로운 형식의 포맷으로 인식하십시오. ('doc'및 'ppt'파일에만 사용되며 'xls'파일에는 해당되지 않습니다.) 네,이 방법은이 문제를 해결하는 적절한 방법이 아니라는 것을 알고 있습니다 만, 시도해 볼만한 가치는 입니다.

나는 모든 것을 시도했다!

희망 하시겠습니까?

관련 문제