【问题标题】:Remove UIWebView's internal cache移除 UIWebView 的内部缓存
【发布时间】:2013-10-07 11:09:46
【问题描述】:

我在UIWebView 中展示了一个网络应用程序,有时页面的内容会发生变化。内容更改后,应用程序会清除缓存。但是当我转到我之前访问过的页面时,UIWebView 不会发送 HTTP GET 请求,而是从缓存加载,即使我已经禁用了缓存,如下所示:

[[NSURLCache sharedURLCache] removeAllCachedResponses];
[[NSURLCache sharedURLCache] setDiskCapacity:0];
[[NSURLCache sharedURLCache] setMemoryCapacity:0];

最初我正在使用 cachePolicy cachePolicy:NSURLRequestReturnCacheDataElseLoad 加载请求。

[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:myURLString] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10.0]];

UIWebView 有某种内部缓存。已经访问过的页面将从这个内部缓存中加载,而不是通过NSURLCache,并且也没有发送请求。

有什么办法可以清除UIWebView的内部缓存吗?我什至正在重新创建UIWebView,但缓存仍然存在。

【问题讨论】:

  • 你有没有在这里尝试解决方案:stackoverflow.com/a/14096331/1749367
  • 是的,这些解决方案中的任何一个都无法成功实现我想要完成的目标。
  • 我找到了一种解决方法 - 将 HTTP 响应标头中的 Cache-Control 属性设置为 max-age=0。然后每次都会为资源发送一个请求。解决此问题的一种方法可能是跟踪自上次清除缓存后是否已请求文件,并在上次清除后第二次加载资源时将 max-age 设置为另一个值(例如 3600)。跨度>
  • 刚刚意识到这种解决方法不起作用,因为当资源被缓存时,它不会在缓存清除后重新加载,所以我失去了对它的控制。
  • @Ravi 不,我的结论是除了重新启动应用程序之外没有办法清除缓存。我最终是这样做的。当必须清除缓存时,会要求用户重新启动应用程序。他们点击一个按钮,应用程序就会为用户自行退出。

标签: ios cocoa-touch caching uiwebview nsurlcache


【解决方案1】:

这里发生的事情似乎是它重新加载了实际的 HTML 文件,但不一定重新加载该页面中的资源。

我见过的一种可能的解决方案是将查询参数附加到 URL 的末尾。例如:

NSString *testURL = [NSString stringWithFormat:@"%@?t=%@", url, randQuery];
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:testURL] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:10.0]];

您在哪里生成 random alphanumeric string 作为您的 randQuery 查询参数,或者保持一个持久计数并向上计数。

这应该强制 UIWebView 从远程资源加载。

【讨论】:

  • 我不想完全禁用缓存。抱歉,我对 NSURLRequestReloadIgnoringLocalAndRemoteCacheData 的使用令人困惑。将更新问题。实际使用 cachePolicy:NSURLRequestReturnCacheDataElseLoad。希望它被缓存,直到我清除缓存。
  • 那么听起来您只需要使用服务器端,您可以在内容更改时使用 AJAX 请求或 Web 套接字,而不是尝试刷新页面。这可能适用于您的情况吗?
  • 好主意,但不适合我的情况。另一家公司创建了网络应用程序。我可以修改它,但网络应用程序已经构建好了。
  • 嗯,我想我可以在 URI 的末尾附加一个字符串。每次缓存清除时唯一的字符串。然后 Web 应用程序必须附加此字符串,例如 some-resource.html?lastpurge=1381693741。对所有资源的引用。
  • 是的,这听起来很像我上面建议的,只是不是在每次刷新时都做一个随机字符串,而是为每个缓存清除构建一个字符串。这可能会为您提供所需的控制。
【解决方案2】:

我遇到了同样的问题,将 HTTPShouldHandleCookies 属性设置为 NO 解决了我的问题。

例如:

NSMutableURLRequest  *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:strurl]];

[request setHTTPShouldHandleCookies:NO];

[webView loadRequest: request];

希望对您有所帮助。

【讨论】:

  • 对我不起作用 - 我正在访问本地文件,而不是通过网络。无论如何谢谢:)
猜你喜欢
  • 2011-07-25
  • 2013-09-09
  • 2013-02-09
  • 2011-02-01
  • 2013-07-24
  • 1970-01-01
  • 2015-03-22
  • 2017-02-03
相关资源
最近更新 更多