【问题标题】:Clear UIWebView cache when use local image file使用本地图像文件时清除 UIWebView 缓存
【发布时间】:2013-01-20 18:02:36
【问题描述】:

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

【问题讨论】:

  • Elio.d 的回答真的为您解决了吗?对我没用。
  • 我也有这个问题,需要解决方案!!!! - 开始赏金!

标签: ios objective-c caching uiwebview nsdocument


【解决方案1】:

除了在每次访问时重命名每个文件外,我只看到一件事可以解决这个问题,那就是使用 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]]

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

【讨论】:

  • 3 年多后仍然发生,你救了一天!
【解决方案2】:

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

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

【讨论】:

  • 对我不起作用。本地图像永远不会更新。而且我有同样的症状,当我退出应用程序并重新启动时,图像会更新。
  • 我认为当您使用远程数据而不是本地数据时它会有所帮助。当您刚刚加载本地 html 文件并且它保持不变时,不会通过重复请求实际重新加载视图内容。
【解决方案3】:

如果您的 html 没有更改并且唯一的更改是图像,您应该使用 UIWebViewreload 消息而不是再次加载请求。

类似这样的:

- (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;
    }
}

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

【讨论】:

  • 这不是真的,我们询问如何清除缓存的唯一原因是因为我们已经重新加载了 html 文件并且图像没有改变。您正在使用 loadRequest 方法,它实际上有一种清除缓存的方法......我使用的是 loadHTML 方法,它无法清除缓存(因为我的 html 文件是在字符串中当场生成的)... 我想我必须将字符串保存为我的包中的实际 .html 文件,然后使用 loadRequest 和它的清除缓存方法。
  • 但是根据问这个问题的人...即使使用loadRequest的清除缓存方法...(cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData)它仍然没有更新png文件在应用程序内更改捆绑包!
  • 关键点在reload消息中。这不是与缓存相关的问题,因为在我的测试项目中,我没有对缓存做任何事情并且一切正常。当我用新图像替换旧图像然后调用reload 时,webview 中的图像发生了变化。我认为这也与您加载数据的方式无关。但应该检查一下。
  • 不幸的是,我已经尝试过重新加载,但它没有工作/:到目前为止,我只是在每次进行更改时重命名所有 108 个图像,然后在整个整个项目,然后重新加载它们并删除旧名称的旧图像(每个图像只有 8x8 像素,所以还不错)
  • 好吧,我做了测试,不得不说你是对的。从字符串加载 html 时,WebView 不会刷新图像。这是非常奇怪的行为。因为当您将文件加载到 WebView 时它会根据需要工作,我认为最好使用这种方法而不是您的方法。将字符串保存在 Temp 目录中并在更改图像时重新加载 WebView 会容易得多。
猜你喜欢
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 2011-02-01
  • 2013-07-24
  • 2012-05-25
  • 1970-01-01
相关资源
最近更新 更多