2012-01-18 17 views
6

Mam zaszyfrowany lokalnie zapisany plik programu Word/Excel/pdf, który muszę wyświetlić w mojej aplikacji na iPada. Rozumiem, że QLPreviewController lub UiDocumentInteractionController mogą być użyte do podglądu tych plików. Mogę bardzo dobrze wykorzystać tenWyświetl zaszyfrowany plik za pomocą frameworka QuickLook lub UiDocumentInteractionController

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

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

ale plik jest zaszyfrowany i kiedy odszyfrować chciałbym zdobyć obiektu NSData. Jak mogę załadować NSData w jednym z nich.

Rozumiem również, że bardzo dobrze można przechowywać NSData z powrotem jako plik lokalny i załadować go do podglądu. Istnieje jednak ograniczenie, aby nie przechowywać lokalnie niezaszyfrowanego pliku.

Jeśli ktoś już to zrobił i może mi w tym pomóc, będzie to bardzo cenne.

Dzięki AJ

Odpowiedz

11

Ponieważ używasz Quick Look, twoje opcje są ograniczone. Musisz podać Quick Look i NSURL, co oznacza, że ​​musi znajdować się w systemie plików (lub w Internecie). Na szczęście nie powinno to stanowić większego problemu. Urządzenia z systemem iOS używają szyfrowania na poziomie sprzętu. Gdy Twój plik jest zaszyfrowany, tylko aplikacja ma klucz do jego odszyfrowania. Twój plik będzie nadal zaszyfrowany, ale będzie także czytelny dla Twojej aplikacji i tylko dla Twojej aplikacji.

Oto co trzeba zrobić:

  1. odszyfrowania pliku do NSData obiektu, który już zrobione.

  2. Zapisz plik w lokalizacji, w której nie będzie przesłany do usługi iCloud ani nie zostanie zarchiwizowany przez iTunes. Katalog tmp jest prawdopodobnie najlepszym wyborem. Kod wygląda mniej więcej tak:

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

    W tym momencie masz bibliotece NSURL które można wykorzystać z Quick Look. Nie zapomnij usunąć odszyfrowanego pliku, gdy skończysz.

Istnieje kilka rzeczy, o których należy pamiętać o szyfrowanie na dysku:

  1. jest obsługiwana tylko w systemie iOS 4.0+.

  2. Może nie działać na "starszych" urządzeniach.

  3. Użytkownik musi mieć aktywne hasło.

  4. Jeśli używasz NSDataWritingFileProtectionComplete, plik jest niedostępny, gdy urządzenie jest zablokowane.Jeśli potrzebujesz dostępu do pliku, gdy aplikacja jest zablokowana, powinieneś użyć zamiast tego NSDataWritingFileProtectionCompleteUnlessOpen lub NSFileProtectionCompleteUntilFirstUserAuthentication. Zapewni to doskonałą ochronę, nawet jeśli urządzenie zostanie skradzione i złamane. Bądź świadomy, chociaż, że dostępne są tylko te opcje szyfrowania na iOS 5.0+

Szczegółowe informacje dla szyfrowania na dysku, sprawdź iOS App Programming Guide

+0

Dzięki Rob za odpowiedź. Te informacje naprawdę pomogły. Mam pytanie uzupełniające na ten temat. Robię to wszystko, aby zapewnić możliwość pracy w trybie offline w mojej aplikacji dla plików. Czy myślisz, że dodam redundancję przez sam szyfrowanie i odszyfrowywanie plików. Czy uważasz, że jest wystarczająco zabezpieczony, aby użyć szyfrowania na dysku i przechowywać pliki w moim folderze dokumentów aplikacji. Również, co byłoby najlepszym miejscem do przechowywania tych plików. Mam na myśli dokumenty lub folder tmp. Jeszcze raz dziękuję. –

+0

Przepraszamy, że już odpowiedziałeś, co byłoby najlepszym miejscem do ich przechowywania. –

+0

Próbowałem również użyć atrybutu NSDataWritingFileProtectionComplete do zapisu plików do folderu tmp aplikacji na symulatorze. Udało mi się przejść do folderu w moim systemie plików i otworzyć dokumenty. Zakładam, że podobne zachowanie będzie miało miejsce w jailbreaku, gdzie mam dostęp do systemu plików urządzenia i mogę przejść do folderu tymczasowego i uzyskać dostęp do dokumentów. Czy to jest prawidłowe założenie. Dzięki –

0

Jednym ze sposobów może być.

użyć Temp Dir, Zapisz plik w Temp, Make NSURL Z tego pliku Temp i Wyświetl, a następnie Usuń ten Temp Dir po tym.

Dzięki.

+0

Tak. To będzie moja ostatnia deska ratunku. –

1

Po wykonaniu niektórych Kopanie, okazało się, że QLPreviewController używa pod spodem UIWebView i wywołuje loadRequest:, aby załadować żądany plik.

Innym sposobem, aby osiągnąć to, czego pragniesz jest stworzenie prywatnej Kategoria na UIWebView, i sposób wykorzystanie swizzling przesłonić metodę loadRequest: i zadzwonić zamiast metoda loadData:MIMEType:textEncodingName:baseURL:.

Pamiętaj, że: pojawia

1) W scenariuszach niskiej pamięci (czyli dużych plików) czarny ekran z „Błąd załadowania dokumentu”, jeśli to dotyczy ciebie. ( unhacked QLPreviewController wie, jak bardzo dobrze poradzić sobie z tymi scenariuszami i przedstawić dokument).

2) Nie jestem pewien, czy Apple zamierza zatwierdzić ten rodzaj hackowania przez , ale nie używa się prywatnych interfejsów API tutaj. Kod

:

@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

Właściwie pisząc plik do katalogu tmp jest wciąż niepewny. Inną alternatywą jest użycie UIWebView z NSURL Protococol i umożliwienie odszyfrowania tych danych w locie.