【问题标题】:How to clear UIWebView cache?如何清除 UIWebView 缓存?
【发布时间】:2011-02-01 04:18:46
【问题描述】:

我需要 UIWebView 来显示一些本地 .webarchive 文件。但是那里的图像名称相同,因此 UIWebView 始终只显示一张图像。如何清除缓存?

提前致谢

【问题讨论】:

    标签: iphone uiwebview


    【解决方案1】:
    // Flush all cached data
    [[NSURLCache sharedURLCache] removeAllCachedResponses];
    

    【讨论】:

    • 这对我不起作用,但 YMMV(特别适用于 link 标签中包含的样式表)。我在UIWebView 上使用-loadHTMLString:baseURL: 方法。安装一个 NSURLCache 子类就可以了,但我不会在调试场景之外使用它。
    • 我的 UIWebView 被缓存了 301 重定向。清除 Safari 的缓存并没有帮助,但是将此调用放在我的 AppDelegate 的 didFinishLaunchingWithOptions 中(就像一次性的一样)最终删除了缓存的重定向。
    【解决方案2】:
    NSURLRequest* request = [NSURLRequest requestWithURL:fileURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.0];
    
    [webView loadRequest:request];
    

    (现在修正了错字)

    【讨论】:

    • 我在这里遇到了同样的问题,所以我尝试了这个,不幸的是这不起作用。我怀疑只有实际的 html 文件本身才被加载而忽略了缓存。我们需要一些方法让页面本身加载文件以忽略缓存...
    【解决方案3】:

    我自己也遇到过缓存脚本和 css 文件的问题。

    我的解决方案是在 src url 上放置一个缓存清除参数:

    <script src='myurl?t=1234'> ...
    

    其中 t=1234 每次页面加载时都会发生变化。

    【讨论】:

    • 哇!呜呜呜!!就我而言,我这样使用它:
    • 这很棒而且很容易实现。一个重要的细节:您不需要实际修改磁盘上文件的名称,只需将查询参数添加到脚本标记(或您正在使用的任何内容),缓存会引用磁盘上的更新文件(具有它总是使用相同的文件名)。很好的解决方案。
    • 也适用于安卓系统!
    【解决方案4】:

    使用

    [[NSURLCache sharedURLCache] removeAllCachedResponses];
    

    在调用之前或加载视图控制器时,这是一个静态函数,用于删除响应的所有缓存数据。 仅使用 cachePolicy 是不够的,我看到 uiwebview 可以刷新 html 文档,但不能刷新 CSS、JS 或图像等链接文档。

    我尝试了这个解决方案并且它有效。

     if (lastReq){
        [[NSURLCache sharedURLCache] removeCachedResponseForRequest:lastReq];
        [[NSURLCache sharedURLCache] removeAllCachedResponses];
    
    }
    
    lastReq=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:localUrl]
                                       cachePolicy:NSURLRequestReloadIgnoringCacheData
                                   timeoutInterval:10000];
    [lastReq setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
    
    [self.mainWebView loadRequest:lastReq];
    

    --首先,我删除最后一个请求的缓存并调用删除所有其他缓存(我认为这不是那么重要) --然后我创建一个 nsurlrequest 并忽略LocalCacheData --最后,加载新的请求

    我检查它并重新加载所有文件(html、css、js 和图像)。

    【讨论】:

    • 应该提到你在哪里做的。
    • 另外你设置了 cachePolicy 两次。故意的?
    • 第二个没有必要,但我不知道为什么它会更好,如果你不放它,有时会保留缓存数据。我在没有 setCachePolicy 的情况下对此进行了测试,但有时只能工作。我把它放进去,大部分时间都在工作。我一直在寻找这个问题的 100% 解决方案,但现在这是我最好的方法 :-)
    【解决方案5】:
    //to prevent internal caching of webpages in application
    NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
    [NSURLCache setSharedURLCache:sharedCache];
    [sharedCache release];
    sharedCache = nil;
    

    尝试使用它。它将清除应用程序的 url 缓存。

    【讨论】:

    • 这对于本地资产来说是一种很棒的“大锤”方法,但在同时执行远程加载资产的应用中可能会出现问题,因为共享 URL 缓存是一个应用范围的设置。跨度>
    • 同意,这不是最好的方法。它会杀死你的缓存,但给你留下一个没有容量的缓存。如果你正在寻找一个简单的重置/启动它是[[NSURLCache sharedURLCache] removeAllCachedResponses];
    • 这是唯一对我有用的方法 - 出于某种原因,removeAllCachedResponses 什么也没做。
    【解决方案6】:

    我正在与一些设计师合作,编辑应用中某些 Web 视图使用的 CSS 文件。他们抱怨样式表的更改没有反映在应用程序中,并且使用Charles 进行的一些调试确认它们没有被重新加载。我似乎在 StackOverflow 上尝试了所有答案,但无济于事。

    最后的诀窍是创建一个覆盖-cachedResponseForRequest:NSURLCache 子类

    - (NSCachedURLResponse*)cachedResponseForRequest:(NSURLRequest*)request
    {
        if ([[[[request URL] absoluteString] pathExtension] caseInsensitiveCompare:@"css"] == NSOrderedSame)
            return nil;
        else
            return [super cachedResponseForRequest:request];
    }
    

    然后我用合理的内存和磁盘容量安装它:

    NSURLCache *currentCache = [NSURLCache sharedURLCache];
    NSString *cachePath = [cachesDirectory() stringByAppendingPathComponent:@"DebugCache"];
    
    DebugURLCache *cache = [[DebugURLCache alloc] initWithMemoryCapacity:currentCache.memoryCapacity diskCapacity:currentCache.diskCapacity diskPath:cachePath];
    [NSURLCache setSharedURLCache:cache];
    [cache release];
    

    (cachesDirectory()是一个函数,返回iOS应用目录下的/Library/Caches)。

    正如您所见,我仅在调试配置中使用它(使用 Additional Preprocessor Flags 构建设置和一些 #ifdefs)。

    【讨论】:

    • 我得到错误没有可见的 UIViewController @interface 声明选择器 cachedResponseForRequest
    • @Frank Schmitt 我正在加载一个包含图像的网络视图。我已经尝试过您的解决方案,但无法重新加载图像。我检查了图像是否缓存在文件系统上,但在文件系统中找不到它们。我假设它们被缓存在内存本身中,并且只会根据需要释放以获取更多内存。我试图通过 [[NSURLCache sharedURLCache] setMemoryCapacity:0] 将内存限制强制为 0; [[NSURLCache sharedURLCache] setDiskCapacity:0];但仍然无法重新加载图像。任何建议都会有所帮助。谢谢。
    【解决方案7】:

    对于 swift 3

    //to remove cache from UIWebview
    URLCache.shared.removeAllCachedResponses()
        if let cookies = HTTPCookieStorage.shared.cookies {
            for cookie in cookies {
                HTTPCookieStorage.shared.deleteCookie(cookie)
            }
        }
    

    【讨论】:

    • 我在我的应用程序中使用了这种方法,但是当用户在再次启动应用程序后在 google 中搜索某些东西时,当用户点击 google 上的搜索文本字段时,用户可以看到他之前搜索过的内容
    【解决方案8】:

    使用以下代码:

    NSString *cacheDir=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];  
      [[NSFileManager defaultManager]removeItemAtPath:cacheDir error:nil];
    

    【讨论】:

    • 这似乎与所提出的问题无关,而且似乎也很危险。 Cache 目录比标准的 http 或 webview 缓存有更多的用途,因此删除整个目录并不是大多数人会使用的解决方案。
    • 很高兴知道如何访问和删除整个缓存目录。文档报告 iOS "may delete the Caches/ directory to free up disk space"。虽然删除 /Cache 目录不是最佳实践,但对于可能需要清除磁盘缓存的开发人员来说,这是一个可供选择的选项,该功能无法使用 [NSURLCache removeAllCachedResponses] 完成,它只清除内存。跨度>
    • 另外,Cache Directory 应该在去掉原来的后替换掉:[[NSFileManager defaultManager]createDirectoryAtPath:cacheDir withIntermediateDirectories:NO attributes:nil error:nil];
    【解决方案9】:

    这项工作就像一个魅力!

    NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
    [NSURLCache setSharedURLCache:sharedCache];
    
    //Clear All Cookies
    for(NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
    }
    

    【讨论】:

      猜你喜欢
      • 2013-02-09
      • 2011-07-25
      • 1970-01-01
      • 2013-07-24
      • 2013-04-16
      • 2013-09-09
      • 1970-01-01
      • 2015-03-22
      相关资源
      最近更新 更多