Моя задача - отобразить поддерживаемые типы документов на iPhone с ОС 3.x, такие как .pdf,.rtf,.doc,.ppt,.png,.tiff и т.д.
Теперь я сохранил эти файлы только зашифрованные на диске. Из соображений безопасности я хочу, чтобы они не сохраняли их на незашифрованном диске.
Следовательно, я предпочитаю использовать loadData:MIMEType:textEncodingName:baseURL:
вместо loadRequest:
для отображения документа, потому что loadData
позволяет мне передавать содержимое в объекте NSData, то есть я могу расшифровать файл в памяти и не нужно хранить он на диске, как это было бы необходимо при использовании loadRequest
.
Проблема заключается в том, что loadData
не работает со всеми типами файлов:
Тестирование показывает, что все типы изображений работают нормально, а также PDF файлы, а более сложные типы - нет. Я получаю такие ошибки, как:
NSURLErrorDomain Code=100
NSURLErrorDomain Code=102
WebView, по-видимому, нуждается в действительно рабочем URL-адресе для доступа к документам в качестве файла, несмотря на то, что я уже предлагаю весь контент через объект NSData.
Здесь код, который я использую для отображения содержимого:
[webView loadData:data MIMEType:type textEncodingName:@"utf-8" baseURL:nil];
Тип mime правильно установлен, например. к "application/msword" для .doc файлов.
Кто-нибудь знает, как я мог бы loadData
работать со всеми типами, которые поддерживает loadRequest? Или, альтернативно, есть ли какой-то способ, я могу сказать, какие типы действительно работают (то есть официально санкционировано Apple) с loadData? Тогда я могу работать в два раза, создавая временный незашифрованный файл только для тех случаев, которые loadData не понравится.
Обновление
Похоже, я не первый, кто работает в этом. См. Здесь:
http://osdir.com/ml/iPhoneSDKDevelopment/2010-03/msg00216.html
Итак, я думаю, что статус-кво, и я ничего не могу с этим поделать.
Кто-то предложил работу, которая может работать, хотя:
http://osdir.com/ml/iPhoneSDKDevelopment/2010-03/msg00219.html
В принципе, идея состоит в том, чтобы предоставить крошечный http-сервер, который обслуживает файл (из памяти в моем случае), а затем использовать loadRequest. Это, вероятно, немного более интенсивно для памяти, хотя, как и сервер, так и веб-просмотр, вероятно, будут содержать все содержимое в памяти в виде двух копий тогда, в отличие от использования loadData, где оба будут иметь общий доступ к одному и тому же объекту данных. (Имейте в виду, мне придется хранить дешифрованные данные в памяти, что весь смысл здесь).