Отображение зашифрованного файла с использованием инфраструктуры QuickLook или UiDocumentInteractionController - PullRequest
6 голосов
/ 19 января 2012

У меня локально хранится зашифрованный файл word / excel / pdf, который необходимо просмотреть в приложении для iPad.Я понимаю, что QLPreviewController или UiDocumentInteractionController можно использовать для предварительного просмотра этих файлов.Я очень хорошо могу использовать это

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

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

Но файл зашифрован, и когда я расшифрую его, я получу объект NSData.Как мне выполнить загрузку NSData в любом из них.

Также я понимаю, что могу очень хорошо сохранить NSData в виде локального файла и загрузить его в Preview.Но есть ограничение не хранить незашифрованный файл локально.

Если кто-то уже выполнил это и может помочь мне в этом, это будет оценено.

Спасибо AJ

Ответы [ 4 ]

11 голосов
/ 02 февраля 2012

Поскольку вы используете Quick Look, ваши возможности ограничены. Вы должны указать Quick Look и NSURL, что означает, что он должен быть в файловой системе (или в Интернете). К счастью, это не должно быть большой проблемой. Устройства iOS используют аппаратное шифрование. Когда ваш файл зашифрован, только ваше приложение имеет ключ для его расшифровки. Таким образом, ваш файл по-прежнему будет зашифрован, но он также будет доступен для чтения вашим приложением и только вашим приложением.

Вот что вы делаете:

  1. Расшифруйте ваш файл в NSData объект, который вы уже сделали.

  2. Запишите файл в место, которое не будет загружено в iCloud и не будет сохранено iTunes Каталог tmp, вероятно, лучший выбор. Код выглядит примерно так:

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

    На данный момент у вас есть NSURL, который вы можете использовать с Quick Look. Не забудьте удалить расшифрованный файл, когда вы закончите с ним.

В отношении шифрования на диске следует отметить несколько моментов:

  1. Поддерживается только на iOS 4.0 +.

  2. Может не работать на «старых» устройствах.

  3. У пользователя должен быть активный код доступа.

  4. Если вы используете NSDataWritingFileProtectionComplete, файл недоступен, пока устройство заблокировано. Если вам нужен доступ к файлу, когда приложение заблокировано, вам следует использовать NSDataWritingFileProtectionCompleteUnlessOpen или NSFileProtectionCompleteUntilFirstUserAuthentication. Это все равно даст вам отличную защиту, даже если устройство украдено и взломано. Имейте в виду, что эти опции шифрования доступны только на iOS 5.0 +

Подробнее о шифровании на диске см. В Руководстве по программированию приложения для iOS

1 голос
/ 12 мая 2015

На самом деле запись файла в каталог tmp все еще небезопасна.Другой альтернативой является использование UIWebView с NSURLProtocol и возможность расшифровки этих данных на лету.

1 голос
/ 29 апреля 2012

После некоторого копания я обнаружил, что QLPreviewController использует UIWebView внизу и вызывает loadRequest: для загрузки запрошенного файла.

Другой способ выполнить то, что вы хотите, - это сделатьчастную категорию на UIWebView, и используйте метод swizzling для переопределения метода loadRequest:, и вместо этого вызовите метод loadData:MIMEType:textEncodingName:baseURL:.

Остерегайтесь, что :

1) В сценариях с нехваткой памяти (т.е. больших файлов) появляется черный экран с «Ошибка при загрузке документа», если это касается вас.(Неподтвержденный QLPreviewController знает, как очень хорошо справляться с этими сценариями и представлять документ).

2) Я не уверен, что Apple собирается одобрить этот вид взлома, хотя здесь не используются частные 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
0 голосов
/ 31 января 2012

Один из способов может быть.

использовать Temp Dir, сохранить файл в Temp, сделать NSURL из этого файла Temp и отобразить, а затем удалить этот временный Dir после этого.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...