21

我使用 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 缓存?

4

3 回答 3

4

除了在每次访问时重命名每个文件之外,我只看到一件事可以解决这个问题,那就是使用 javascript 修改 HTML 以在图像 url 上添加时间戳,这样它就会欺骗 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(例如 me.js?ts=236136236 和whatever.js?ts=3153524623)。我发现这很好用。

我需要做的另一件事是在将 HTML 文件加载到 webview 时为其路径添加时间戳,如下所示:

[NSURL URLWithString:[[NSString stringWithFormat:@"%@/index.html?pizza=%f", webDirectoryPath, [[NSDate date] timeIntervalSince1970]]

我现在可以修改所有本地文件,并且每次 webview 出现时,更改都会通过。

于 2013-07-17T04:04:53.510 回答
2

你可以试试这个,在你的 AppDelegate.m

+(void)initialize {
  [[NSURLCache sharedURLCache] setDiskCapacity:0];
  [[NSURLCache sharedURLCache] setMemoryCapacity:0];
}
于 2013-02-09T00:33:39.767 回答
1

如果您的 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;
    }
}

您甚至不需要对缓存进行任何操作。

于 2013-05-31T03:38:50.447 回答