Ответ 1
Вы можете попробовать это, в своем AppDelegate.m
+(void)initialize {
[[NSURLCache sharedURLCache] setDiskCapacity:0];
[[NSURLCache sharedURLCache] setMemoryCapacity:0];
}
Я использую UIWebView для загрузки локального html, и внутри html создается файл PNG, созданный Objc.
После изменения PNG файла я перезагрузите html в UIWebView, но изображение не изменится. Однако , если я закрою приложение и снова его закрою, файл изображения будет изменен на новый.
Я проверил PNG файл в Documents with Finder, поэтому я уверен, что он был изменен, но старый все еще находится в UIWebView.
Итак, поскольку я думаю, что это проблема кэширования UIWebView, я пробовал:
[[NSURLCache sharedURLCache] removeAllCachedResponses];
[_webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:url isDirectory:NO ] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:1]];
или NSURLRequestReloadIgnoringCacheData
Ни один из них не работает, и я не могу изменить имя файла, потому что PNG файл используется во многих местах (другой код html и objc).
Я тоже пробовал:
some.png?r=randomNumber
но он не может быть показан.
Как очистить кеш UIWebView при использовании локального файла изображения внутри локального html?
Вы можете попробовать это, в своем AppDelegate.m
+(void)initialize {
[[NSURLCache sharedURLCache] setDiskCapacity:0];
[[NSURLCache sharedURLCache] setMemoryCapacity:0];
}
Помимо переименования каждого файла в каждом доступе, я видел, что одна вещь работает для этого, и это изменяет HTML с помощью javascript, чтобы добавить временную метку на URL-адрес изображения, чтобы он обманул веб-просмотр, считая его другим файлом. Изображения (обычно) загружают то же самое независимо от того, что вы положили после? в их URL. Я думаю, что это было бы проще, чем переименование каждого файла каждый раз при загрузке веб-представления. Что-то вроде этого (используя jQuery):
<img src="myimg.jpg" />
<script>
$(function() {
$('img').each(function(i, el) {
$(el).attr('src', $(el).attr('src')+'?pizza='+(new Date()).getTime());
});
});
</script>
Я предполагаю, что это предполагает, что этот javascript загружается и запускается до загрузки изображений, но теоретически это должно работать.
Для небольшого фона я сделал страницу в веб-просмотре, которая использовала RequireJS для асинхронной загрузки нескольких файлов. У меня была ТОЧНАЯ проблема, о которой идет речь, кроме того, что я загружал файлы javascript вместо изображений. Ключом к устранению этой проблемы было добавление метки времени к каждому пути файла javascript и, таким образом, обход веб-просмотра (ex me.js? Ts = 236136236 и whatever.js? Ts = 3153524623). Я нашел, что это отлично работает.
Еще одна вещь, которую мне нужно было сделать, это добавить временную метку к пути моего HTML файла при загрузке его в веб-представление следующим образом:
[NSURL URLWithString:[[NSString stringWithFormat:@"%@/index.html?pizza=%f", webDirectoryPath, [[NSDate date] timeIntervalSince1970]]
Теперь я могу изменить все локальные файлы, и каждый раз, когда появляется веб-просмотр, происходят изменения.
Если ваш html не изменился, и единственное изменение было на изображении, вы должны использовать сообщение UIWebView
reload
вместо повторного загрузки запроса.
Что-то вроде этого:
- (void)reloadWebView:(id)sender
{
if (self.loaded) {
[self.webView reload];
} else {
NSString *html = [[NSBundle mainBundle] pathForResource:@"web" ofType:@"html"];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL fileURLWithPath:html]];
[self.webView loadRequest:request];
self.loaded = YES;
}
}
Вам даже не нужны манипуляции с кешем.