2012-01-18 3 views
6

iPad 앱에서 미리 볼 필요가있는 암호화 된 단어/엑셀/pdf 파일이 로컬에 저장되어 있습니다. QLPreviewController 또는 UiDocumentInteractionController를 사용하여 이러한 파일을 미리 볼 수 있음을 이해합니다. 나는 이것을 잘 사용할 수있다.QuickLook 프레임 워크 또는 UiDocumentInteractionController를 사용하여 암호화 된 파일 표시

- (id <QLPreviewItem>) previewController: (QLPreviewController *) controller previewItemAtIndex: (NSInteger) index { 

    return [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:[documents objectAtIndex:index] ofType:nil]]; 
} 

그러나 파일이 암호화되어 있고 암호를 해독하면 NSData 객체가 저장 될 것이다. NSData를 어떻게로드 할 것인가?

또한 NSData를 로컬 파일로 저장하고 미리보기에로드 할 수 있음을 잘 알고 있습니다. 그러나 암호화되지 않은 파일을 로컬에 저장하지 않는 제약이 있습니다.

누군가 이미이 작업을 수행하고 여기에서 나를 도울 수 있다면 크게 감사하겠습니다.

감사

답변

11

Quick Look을 사용하고 있으므로 옵션이 제한됩니다. Quick LookNSURL으로 지정해야합니다. 즉 파일 시스템 (또는 인터넷)에 있어야합니다. 다행히도, 이것은 큰 문제가되어서는 안됩니다. iOS 기기는 하드웨어 수준 암호화를 사용합니다. 파일이 암호화되면 앱에만 해독 키가 있습니다. 따라서 파일은 여전히 ​​암호화되지만 앱과 앱에서만 읽을 수 있습니다.

여기에 당신이 무엇을 :

  1. 이미 수행 한 NSData 객체로 파일을 해독.

  2. 이 iCloud에 업로드되거나 iTunes에서 백업되지 않는 위치에 파일을 작성하십시오. tmp 디렉토리가 아마도 최선의 선택 일 것입니다. 당신은 당신이 Quick Look와 함께 사용할 수있는 NSURL이이 시점에서

    NSData * data = // Your decrypted file data. 
    NSString * fileName = // Whatever you want to name your file. 
    NSString * path = [NSTemporaryDirectory() stringByAppendingPathComponent:fileName]; 
    NSURL * url = [NSURL URLWithString:path]; 
    NSError * error = nil; 
    
    BOOL success = [data writeToURL:url 
             options:NSDataWritingFileProtectionComplete 
              error:&error]; 
    if (success) { 
        // Give the URL to Quick Look. 
    } 
    else { 
        // An error happened. See the 'error' object for the details. 
    } 
    

    : 코드는 다음과 같이 보입니다. 암호 해독 된 파일을 삭제 한 것을 잊지 마십시오. 4.0 이상 그것은 단지 iOS에서 지원됩니다

    1. :

    는 온 디스크 암호화에 대해주의해야 할 몇 가지가 있습니다.

  3. "오래된"장치에서는 작동하지 않을 수 있습니다.

  4. 사용자는 활성 암호가 있어야합니다.

  5. NSDataWritingFileProtectionComplete을 사용하는 경우 장치가 잠겨있는 동안 파일에 액세스 할 수 없습니다.앱이 잠긴 상태에서 파일에 액세스해야하는 경우 대신 NSDataWritingFileProtectionCompleteUnlessOpen 또는 NSFileProtectionCompleteUntilFirstUserAuthentication을 사용해야합니다. 장치를 도난 당하고 탈옥 한 경우에도 여전히 큰 보호를 제공합니다. 이러한 암호화 옵션이 아이폰 OS 5.0에 디스크 암호화에 대한 자세한 내용은

에서만 사용할 수 있다고하지만,주의 뒷조사를하고 후 iOS App Programming Guide

+0

감사 응답 Rob. 이 정보는 실제로 도움이되었습니다. 나는 이것에 대한 후속 질문을 가지고있다. 파일에 대한 응용 프로그램에서 오프라인 기능을 제공하기 위해이 모든 작업을 수행하고 있습니다. 나 혼자서 파일을 암호화하고 해독하여 중복성을 추가한다고 생각하십니까? 대신에 디스크에 암호화를 사용하고 응용 프로그램의 내 문서 폴더에 파일을 저장하기에 충분하다고 생각하십니까? 또한이 파일을 저장하는 가장 좋은 장소는 무엇입니까? 나는 문서 또는 tmp 폴더를 의미합니다. 다시 한번 감사드립니다. –

+0

죄송 합니다만 저장하기 가장 좋은 장소는 무엇입니까? –

+0

또한 NSDataWritingFileProtectionComplete 특성을 사용하여 시뮬레이터의 응용 프로그램 tmp 폴더에 파일을 쓰려고했습니다. 내 파일 시스템의 폴더로 이동하여 문서를 열 수있었습니다. jailbroken 장치에서 파일 시스템에 대한 액세스 권한이 있으며 임시 폴더로 이동하여 문서에 액세스 할 수있는 유사한 동작이 있다고 가정합니다. 그것이 올바른 가정입니까? 감사합니다. –

0

한 가지 방법이 될 수 AJ.

임시 파일을 임시 파일에 저장하고 해당 임시 파일에서 NSURL을 만든 다음 그 후에 임시 디렉터리를 삭제하고 삭제하십시오.

감사합니다.

+0

예. 그게 내 최후의 수단이 될거야. –

1

을 확인, 내가 발견 QLPreviewController을 그 아래에 UIWebView을 사용하고 loadRequest:을 호출하여 요청한 파일을로드합니다.

당신이 원하는 무엇을 달성하는 또 다른 방법은 loadRequest: 메소드를 오버라이드 (override) 할 UIWebView, 및 사용 방법은 스위 즐링에 개인 범주를 확인하고 loadData:MIMEType:textEncodingName:baseURL: 방법 대신 호출하는 것입니다.

조심하십시오 : 그것이 당신을 우려하는 경우 메모리 부족 시나리오에서

1) (즉, 큰 파일) "문서를로드하는 오류" 검은 화면이 나타납니다. 해킹되지 않은 QLPreviewController는 이러한 시나리오를 처리하는 방법을 잘 알고 있으며 문서를 제공합니다. ).

2) 여기에 개인용 API는 사용되지 않았지만 애플이이 종류의 해킹을 승인 할 것인지 확실치 않습니다.

코드 :

@implementation UIWebView (QLHack) 

    - (void)MyloadRequest:(NSURLRequest *)request 
    { 
     // Check somehow that it's the call of your QLPreviewController   
     // If not, just call the original method. 

     if (!insideQLPreviewController) 
     { 
      // Call original implementation 
      [self MyloadRequest:request];  
     } 
     else 
     { 
      // Load the real data you want 
      [self loadData:data MIMEType:mimeType textEncodingName:nil baseURL:someURL]; 
     } 

    } 

    + (void)load 
    { 
     method_exchangeImplementations(class_getInstanceMethod(self, @selector(loadRequest:)), class_getInstanceMethod(self, @selector(MyloadRequest:))); 
    } 

@end 
1

실제로하는 tmp 디렉토리에 파일을 작성하는 것은 여전히 ​​불안하다. 다른 대안은 UIWebView를 NSURLProtocol과 함께 사용하고이 데이터를 해독하는 것입니다.

관련 문제