Удалить внутренний кеш UIWebView

Я показываю веб-приложение в UIWebView, и иногда содержимое страниц меняется. После изменения содержимого приложение очищает кеш. Но когда я перехожу на страницу, которую я ранее посещал, UIWebView не отправляет HTTP-запрос GET, а загружается из кеша, хотя я отключил кеш следующим образом:

[[NSURLCache sharedURLCache] removeAllCachedResponses];
[[NSURLCache sharedURLCache] setDiskCapacity:0];
[[NSURLCache sharedURLCache] setMemoryCapacity:0];

Изначально я загружаю запрос с помощью cachePolicy cachePolicy:NSURLRequestReturnCacheDataElseLoad.

[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:myURLString] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10.0]];

UIWebView есть какой-то внутренний кеш. Уже посещенные страницы будут загружаться из этого внутреннего кеша, а не проходить через NSURLCache, а также не отправляются запросы.

Есть ли способ очистить внутренний кеш UIWebView? Я даже UIWebView воссоздаю, но кеш все еще есть.


person Niklas Berglund    schedule 01.10.2013    source источник
comment
Вы пробовали решение здесь: stackoverflow.com/a/14096331/1749367   -  person helper    schedule 01.10.2013
comment
Да, ни одно из этих решений не принесет успеха тому, чего я хочу достичь.   -  person Niklas Berglund    schedule 13.10.2013
comment
Я нашел обходной путь - установил для атрибута Cache-Control в заголовке HTTP-ответа значение max-age = 0. Тогда каждый раз на ресурс будет отправляться запрос. Способ решить эту проблему может заключаться в том, чтобы отслеживать, запрашивался ли файл раньше с момента последней очистки кеша, и устанавливать max-age на другое значение (например, 3600) во второй раз, когда ресурс загружается после последней очистки.   -  person Niklas Berglund    schedule 13.10.2013
comment
Просто понял, что этот обходной путь не работает, так как когда ресурс кэшируется, он не будет перезагружен после очистки кеша, поэтому я теряю над ним контроль.   -  person Niklas Berglund    schedule 13.10.2013
comment
@NiklasBerglund Удалось ли вам решить эту проблему? Я пробовал использовать все упомянутые параметры, и даже обходные пути, такие как добавление случайного параметра get, не работают для меня!   -  person Ravi    schedule 18.11.2013
comment
@Ravi нет, я пришел к выводу, что нет другого способа очистить кеш, кроме перезапуска приложения. Так я и сделал в итоге. Когда необходимо очистить кеш, пользователя просят перезапустить приложение. Они нажимают кнопку, и приложение закрывается для пользователя.   -  person Niklas Berglund    schedule 21.11.2013
comment
@NiklasBerglund Спасибо за разъяснения. Даже я в итоге сделал нечто подобное. Я сомневаюсь, что делает приложение HttpWatch для iOS. Я также попытался изменить ключи кеша веб-представления, которые я видел в NSUserDefaults, но не имел никакого смысла. Спасибо.   -  person Ravi    schedule 22.11.2013


Ответы (2)


Похоже, что здесь происходит перезагрузка фактического HTML-файла, но не обязательно перезагружает ресурсы на этой странице.

Возможное решение, которое я видел, - добавить параметр запроса в конец URL-адреса. Например:

NSString *testURL = [NSString stringWithFormat:@"%@?t=%@", url, randQuery];
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:testURL] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:10.0]];

где вы генерируете случайную буквенно-цифровую строку в качестве параметра запроса randQuery, или ведите постоянный счет и просто считайте.

Это должно заставить UIWebView загружаться с удаленного ресурса.

person Joel Fischer    schedule 13.10.2013
comment
Однако я не хочу полностью отключать кеширование. К сожалению, использование NSURLRequestReloadIgnoringLocalAndRemoteCacheData сбивает с толку. Обновлю вопрос. Фактически с использованием cachePolicy: NSURLRequestReturnCacheDataElseLoad. Хочу, чтобы он был кеширован, пока я не очищу кеш. - person Niklas Berglund; 13.10.2013
comment
Тогда кажется, что вам просто нужно использовать серверную часть, вы могли бы использовать запросы AJAX или веб-сокеты при изменении содержимого, а не пытаться обновить страницу. Может ли это сработать в вашей ситуации? - person Joel Fischer; 13.10.2013
comment
Хорошая идея, но в моем случае не подходит. Другая компания создала веб-приложение. Я могу его изменить, но веб-приложение уже создано. - person Niklas Berglund; 13.10.2013
comment
Хммм, думаю, я мог бы добавить строку в конец URI. Строка, уникальная для каждой очистки кеша. Затем веб-приложение должно было бы добавить эту строку, например some-resource.html? Lastpurge = 1381693741. Ко всем ссылкам на ресурсы. - person Niklas Berglund; 13.10.2013
comment
Да, это очень похоже на то, что я предлагал выше, просто вместо того, чтобы создавать случайную строку при каждом обновлении, вы создаете строку для каждой очистки кеша. Это может дать вам необходимый контроль. - person Joel Fischer; 14.10.2013
comment
@NiklasBerglund Этот метод сработал для вас? Есть ли шанс, что я все еще могу получить награду? - person Joel Fischer; 20.10.2013
comment
Спасибо за ответ, но я не отметил его как правильный ответ, поскольку он не отвечает на мой вопрос, как очистить кеш, а вместо этого предлагает обходной путь. За него автоматически была присуждена половина награды, так как это ответ с наибольшим количеством голосов. - person Niklas Berglund; 25.10.2013
comment
Закончился просьбой к пользователю перезапустить приложение, чтобы все изменения вступили в силу. - person Niklas Berglund; 25.10.2013
comment
у меня не работает, когда я пытаюсь перезагрузить локальный веб-ресурс. Возможно, это работает только для удаленного запроса? - person chipbk10; 23.03.2015

У меня была такая же проблема, и установка для свойства HTTPShouldHandleCookies значения NO устранила мою проблему.

Например:

NSMutableURLRequest  *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:strurl]];

[request setHTTPShouldHandleCookies:NO];

[webView loadRequest: request];

Надеюсь на эту помощь.

person Katerina    schedule 14.11.2013
comment
У меня не сработало - но я обращаюсь к локальным файлам, а не по сети. Спасибо, в любом случае :) - person Pirkka Esko; 02.09.2014