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
, Я предпочел бы последнее, но я не могу понять, как это сделать.