iOS: загрузите большой файл и расшифруйте его, например, в. didReceiveData

У меня есть задача улучшить безопасность в приложении для обмена документами. Файлы на сервере должны быть зашифрованы, и когда приложение загружает файл, было бы желательно, чтобы дешифрование происходило одновременно с загрузкой файла, например. didReceiveData, У некоторых клиентов видеофайлы находятся под системным ограничением в 500 МБ.

Прямо сейчас файлы загружаются со старым ASIHTTPRequest из-за встроенной поддержки возобновления загрузок (setAllowResumeForFileDownloads).

Я нашел этот блестящий фреймворк RNCryptor, который поддерживает асинхронное дешифрование. Вот образец с использованием чистого NSURLConnection:

- (void)connection:(NSURLConnection *)connection didReceiveResponse (NSURLResponse*)response {
    self.decryptor = [[RNOpenSSLDecryptor alloc] initWithSettings:kRNCryptorAES256Settings password:password handler:^(RNCryptor *cryptor, NSData *data) {
        [self writeData:data];

        if (cryptor.isFinished){
            [self finishAndPlayVideo];
        }
    }];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [self.decryptor addData:data];
}

Проблема в том, что RNCryptor имеет это NSMutableData *inData который он добавляет все данные, но это дает огромные проблемы с памятью. Данные должны передаваться через потоки, как в старой версии 1.1 RNOpenSSLCryptor.m.

У кого-нибудь есть решение манипулировать RNCryptor, ASIHTTPRequest (или же AFNetworking) код для загрузки и расшифровки огромных файлов одновременно?

Обновление 1:

Как @warrenm указывает на RNCryptor Категория на NSMutableData должна помочь в использовании памяти. Я не могу понять, если это виновник.

Обновление 2:

Я нашел виновника. Я готовил свой тестовый проект, чтобы сделать его пригодным для запуска другими. Я изменил URL-адрес загрузки с сервера быстрого копирования на dropbox, и внезапно использование памяти сократилось. Это означает, что приложение загружается быстрее, чем оно может расшифровать данные и, следовательно, создать буфер. Я никогда не думал об этом как о проблеме. Спасибо @warrenm за лидерство.

Тестовый проект

https://dl.dropbox.com/u/195602/stackru/OnlineDecryptTest.zip Переключить константы kUseFastServer а также kUseEncryption в ViewController.m чтобы увидеть различные случаи использования памяти.

Решение

Решение состоит в том, чтобы сделать загрузку и расшифровку двухэтапным процессом или поработать с волшебством NSInputStream/NSOutputStream, Я предпочел бы последнее, но я не могу понять, как это сделать.

0 ответов

Другие вопросы по тегам