2012-01-18 11 views
6

Tôi có tệp được lưu trữ từ/excel/pdf được lưu trữ cục bộ mà tôi cần xem trước trong ứng dụng iPad của mình. Tôi hiểu rằng QLPreviewController hoặc UiDocumentInteractionController có thể được sử dụng để xem trước các tệp này. Tôi có thể sử dụng rất tốt điều nàyHiển thị tệp được mã hóa bằng khung QuickLook hoặc UiDocumentInteractionController

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

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

Nhưng tệp được mã hóa và khi tôi giải mã, tôi sẽ giữ đối tượng NSData. Làm thế nào để tôi đi về tải NSData trong một trong những.

Ngoài ra tôi hiểu rằng tôi có thể lưu trữ rất tốt NSData trở lại dưới dạng tệp cục bộ và tải tệp đó trong Xem trước. Nhưng có một hạn chế không lưu trữ tệp không được mã hóa cục bộ.

Nếu ai đó đã hoàn thành công việc này và có thể giúp tôi ở đây, nó sẽ được đánh giá cao.

Cảm ơn AJ

Trả lời

11

Vì bạn đang sử dụng Quick Look, các tùy chọn của bạn bị giới hạn. Bạn phải cung cấp Quick Look một số NSURL, có nghĩa là nó phải nằm trên hệ thống tệp (hoặc Internet). May mắn thay, điều này không phải là một vấn đề. Thiết bị iOS sử dụng mã hóa cấp phần cứng. Khi tệp của bạn được mã hóa, chỉ ứng dụng của bạn có khóa để giải mã tệp. Vì vậy, tệp của bạn sẽ vẫn được mã hóa nhưng ứng dụng của bạn cũng sẽ chỉ có thể đọc được ứng dụng của bạn và chỉ ứng dụng của bạn.

Dưới đây là những gì bạn làm:

  1. Giải mã tập tin của bạn vào một đối tượng NSData, mà bạn đã làm.

  2. Viết tệp vào vị trí mà sẽ không tải lên iCloud hoặc sao lưu bằng iTunes. Thư mục tmp có lẽ là lựa chọn tốt nhất. Mã trông giống như sau:

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

    Tại thời điểm này, bạn có NSURL mà bạn có thể sử dụng với Quick Look. Đừng quên xóa các tập tin giải mã khi bạn đang thực hiện với nó.

Có một vài điều cần lưu ý về mã hóa trên đĩa:

  1. Nó chỉ được hỗ trợ trên iOS 4.0+.

  2. Nó có thể không hoạt động trên các thiết bị "cũ".

  3. Người dùng phải có mật mã hoạt động.

  4. Nếu bạn sử dụng NSDataWritingFileProtectionComplete, không thể truy cập tệp trong khi thiết bị bị khóa.Nếu bạn cần truy cập tệp trong khi ứng dụng bị khóa, thì bạn nên sử dụng NSDataWritingFileProtectionCompleteUnlessOpen hoặc NSFileProtectionCompleteUntilFirstUserAuthentication thay thế. Điều này sẽ vẫn cung cấp cho bạn bảo vệ tuyệt vời, ngay cả khi thiết bị bị đánh cắp và bẻ khóa. Hãy nhận biết, tuy nhiên, rằng những tùy chọn mã hóa chỉ có sẵn trên iOS 5.0+

Để biết thêm thông tin chi tiết cho mã hóa trên đĩa, kiểm tra iOS App Programming Guide

+0

Cảm ơn Rob đã trả lời. Thông tin này thực sự hữu ích. Tôi có một câu hỏi tiếp theo về vấn đề này. Tôi đang làm tất cả điều này để cung cấp khả năng ngoại tuyến trong ứng dụng của tôi cho các tệp. Bạn có nghĩ rằng tôi đang thêm dự phòng bằng cách tự mã hóa và giải mã các tệp. Thay vào đó bạn có nghĩ rằng nó đủ bảo đảm cho tôi để chỉ sử dụng mã hóa trên đĩa và lưu trữ các tệp trong thư mục tài liệu của tôi của ứng dụng. Ngoài ra những gì sẽ là nơi tốt nhất để lưu trữ các tập tin này. Tôi có nghĩa là tài liệu hoặc thư mục tmp. Cảm ơn bạn lần nữa. –

+0

Xin lỗi bạn đã trả lời đâu là nơi tốt nhất để lưu trữ chúng. –

+0

Ngoài ra tôi đã thử sử dụng thuộc tính NSDataWritingFileProtectionComplete để ghi tệp vào thư mục tmp của ứng dụng trên trình mô phỏng. Tôi đã có thể vào thư mục trong hệ thống tệp của mình và mở tài liệu. Tôi giả định rằng sẽ có một hành vi tương tự trên một thiết bị bẻ khóa, nơi tôi có quyền truy cập vào hệ thống tệp của thiết bị và tôi có thể duyệt qua thư mục tạm thời và truy cập tài liệu. Đó có phải là một giả định chính xác không. Cảm ơn –

0

Một cách có thể.

sử dụng Temp Dir, Lưu tệp theo Temp, tạo NSURL từ tệp Temp và hiển thị đó và sau đó xóa điều chỉnh nhiệt độ đó sau đó.

Cảm ơn.

+0

Có. Đó sẽ là phương sách cuối cùng của tôi. –

1

Sau khi thực hiện một số đào, tôi phát hiện ra rằng QLPreviewController đang sử dụng UIWebView bên dưới và gọi số loadRequest: để tải tệp được yêu cầu.

Một cách khác để thực hiện những gì bạn mong muốn là làm cho một loại tin trên UIWebView, và phương pháp sử dụng swizzling để ghi đè lên các phương pháp loadRequest:, và gọi thay vì phương pháp loadData:MIMEType:textEncodingName:baseURL:.

Ghi chú rằng:

1) Trong kịch bản bộ nhớ thấp (ví dụ các file lớn) một màn hình màu đen với "Lỗi để tải tài liệu" xuất hiện, nếu điều đó liên quan đến bạn. ( QLPreviewController chưa được xử lý biết cách xử lý các tình huống này rất tốt và trình bày tài liệu).

2) Tôi không chắc Apple sẽ đi để phê duyệt loại hack này, mặc dù không có API riêng nào được sử dụng tại đây.

mã:

@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

Trên thực tế, viết một tập tin vào một thư mục tmp vẫn không an toàn. Cách khác là sử dụng UIWebView với NSURLProtocol và cho phép giải mã dữ liệu này một cách nhanh chóng.