Подтвердить что ты не робот

Очистить кеш UIWebView при использовании файла локального изображения

Я использую 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?

4b9b3361

Ответ 1

Вы можете попробовать это, в своем AppDelegate.m

+(void)initialize {
  [[NSURLCache sharedURLCache] setDiskCapacity:0];
  [[NSURLCache sharedURLCache] setMemoryCapacity:0];
}

Ответ 2

Помимо переименования каждого файла в каждом доступе, я видел, что одна вещь работает для этого, и это изменяет 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]]

Теперь я могу изменить все локальные файлы, и каждый раз, когда появляется веб-просмотр, происходят изменения.

Ответ 3

Если ваш 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;
    }
}

Вам даже не нужны манипуляции с кешем.