我使用UIWebView加载本地html,并且在Objc创建的html中有一个PNG文件。
修改PNG文件后,我在UIWebView中重新加载html,但图像不会改变。但是,如果我退出应用并重新打开它,图片文件将更改为新的。
我已经在使用Finder的Documents中检查了PNG文件,所以我确定它已被修改,但旧的仍在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
但它无法显示。
如何在本地html中使用本地图像文件时清除UIWebView缓存?
答案 0 :(得分:4)
除了重命名每次访问的每个文件之外,我只看到一件事情可以解决这个问题,即使用javascript修改HTML以在图像网址上添加时间戳,这样就可以让webview认为它是一个不同的文件。图像(通常)加载相同,无论你放在什么后?在他们的网址中。我认为这比每次加载Web视图时重命名每个文件都容易。像这样(使用jQuery):
<img src="myimg.jpg" />
<script>
$(function() {
$('img').each(function(i, el) {
$(el).attr('src', $(el).attr('src')+'?pizza='+(new Date()).getTime());
});
});
</script>
我想这是假设这个javascript在加载图像之前加载并运行,但理论上这应该可行。
对于一些背景知识,我在webview中创建了一个页面,该页面使用RequireJS来异步加载相当多的文件。除了我正在加载javascript文件而不是图像之外,我遇到了与此问题相同的问题。解决这个问题的关键是为javascript文件的每个路径添加一个时间戳,从而欺骗webview(ex me.js?ts = 236136236和whatever.js?ts = 3153524623)。我觉得这很好用。
我需要做的另一件事是在将HTML文件加载到webview中时添加一个时间戳,如下所示:
[NSURL URLWithString:[[NSString stringWithFormat:@"%@/index.html?pizza=%f", webDirectoryPath, [[NSDate date] timeIntervalSince1970]]
我现在可以修改所有本地文件,每次webview出现时都会发生变化。
答案 1 :(得分:2)
您可以在AppDelegate.m中尝试此操作
+(void)initialize {
[[NSURLCache sharedURLCache] setDiskCapacity:0];
[[NSURLCache sharedURLCache] setMemoryCapacity:0];
}
答案 2 :(得分:1)
如果您的html没有更改且唯一的更改是在图片中,则应使用UIWebView
的{{1}}消息,而不是再次加载请求。
这样的事情:
reload
你甚至不需要对缓存进行任何操作。