【问题标题】:Clearing UIWebview cache清除 UIWebview 缓存
【发布时间】:2011-07-25 00:33:48
【问题描述】:

我已经使用 UIWebview 使用 loadRequest: 方法加载网页,当我离开那个场景时,我调用 [self.webView stopLoading]; 并释放 webView。

在第一次启动时的活动监视器中,我发现实际内存增加了 4MB,而在多次启动/加载时,实际内存并没有增加。它只增加一次。

我已经检查了 webview 的保留计数。它是正确的,即 0。我认为 UIWebView 正在缓存一些数据。如何避免缓存或删除缓存的数据?还是有其他原因?

【问题讨论】:

    标签: ios cocoa-touch uiwebview uikit


    【解决方案1】:

    我实际上认为当您关闭UIWebView 时它可能会保留缓存的信息。我尝试从UIViewController 中删除UIWebView,释放它,然后创建一个新的。当我回到一个地址而无需重新加载所有内容时,新的会准确记住我所在的位置(它记得我之前的UIWebView 已登录)。

    所以有几个建议:

    [[NSURLCache sharedURLCache] removeCachedResponseForRequest:NSURLRequest];
    

    这将删除特定请求的缓存响应。还有一个调用将删除在UIWebView 上运行的所有请求的所有缓存响应:

    [[NSURLCache sharedURLCache] removeAllCachedResponses];
    

    之后,您可以尝试使用UIWebView 删除任何关联的cookie:

    for(NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {
    
        if([[cookie domain] isEqualToString:someNSStringUrlDomain]) {
    
            [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
        }
    }
    

    斯威夫特 3:

    // Remove all cache 
    URLCache.shared.removeAllCachedResponses()
    
    // Delete any associated cookies     
    if let cookies = HTTPCookieStorage.shared.cookies {
        for cookie in cookies {
            HTTPCookieStorage.shared.deleteCookie(cookie)
        }
    }
    

    【讨论】:

    • 那么 loadHTMLString:baseURL: 呢?当我删除 cookie 和 URL 缓存时,它似乎不起作用...
    • 嗨,我试过 [[NSURLCache sharedURLCache] removeAllCachedResponses];,但它不起作用,我的缓存中仍然有相同的图像......还有其他解决方法吗?
    • 是的,这里也一样,我正在获得持久登录,我认为 UIWebView 可能持有令牌的时间过长。有什么想法吗?
    • 这在 iOS 7 中是否有效,因为从过去几天我遇到了同样的问题,我使用了上面的代码但没有任何反应,我仍然在我的 webview 中看到缓存的页面。对此@groomsy 的任何建议
    • 清除 NSURLCache 对 iOS7 没有帮助,但我有一个涉及 NSURLProtocol 的 hack-ish 解决方法。 stackoverflow.com/a/26408420/449161
    【解决方案2】:

    不要完全禁用缓存,这会损害您的应用性能,而且没有必要。重要的是在应用程序启动时显式配置缓存并在必要时清除它。

    所以在application:DidFinishLaunchingWithOptions:中配置缓存限制如下:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {   
        int cacheSizeMemory = 4*1024*1024; // 4MB
        int cacheSizeDisk = 32*1024*1024; // 32MB
        NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"];
        [NSURLCache setSharedURLCache:sharedCache];
    
        // ... other launching code
    }
    

    正确配置后,当您需要清除缓存时(例如在applicationDidReceiveMemoryWarning 或关闭UIWebView 时),只需执行以下操作:

    [[NSURLCache sharedURLCache] removeAllCachedResponses];
    

    您会看到内存已恢复。我在这里写了关于这个问题的博客:http://twobitlabs.com/2012/01/ios-ipad-iphone-nsurlcache-uiwebview-memory-utilization/

    【讨论】:

    • 如果可以的话,还有更多优点。我认为这提高了性能并解决了我过度激进的缓存问题。
    【解决方案3】:

    您可以通过执行以下操作来禁用缓存:

    NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
    [NSURLCache setSharedURLCache:sharedCache];
    [sharedCache release];
    

    弧:

    NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
    [NSURLCache setSharedURLCache:sharedCache];
    

    【讨论】:

    • 就我而言,我根本不需要任何缓存,所以这个答案对我很有帮助。对于选择此方向的其他人:这些行也放置在 didFinishLaunchingWithOptions 中。在较新的应用程序中应该省略最后一行(sharedCache 版本),因为 ARC 现在会为您处理。
    【解决方案4】:

    斯威夫特 3.

    // Remove all cache 
    URLCache.shared.removeAllCachedResponses()
    
    // Delete any associated cookies     
    if let cookies = HTTPCookieStorage.shared.cookies {
        for cookie in cookies {
            HTTPCookieStorage.shared.deleteCookie(cookie)
        }
    }
    

    【讨论】:

    • 这作为对另一个答案的编辑会更好,因为对于未指定语言的问题来说,它只是一种不同的语言。
    • 如果您在同一个应用程序中使用 api + 令牌和 webview + 身份验证,则可以完美地清除缓存会话!
    【解决方案5】:

    我无法更改代码,因此我需要命令行来进行测试,并认为这可以帮助某人:

    应用程序特定的缓存存储在~/Library/Caches/<bundle-identifier-of-your-app>,因此只需按以下方式删除并重新打开您的应用程序

    rm -rf ~/Library/Caches/com.mycompany.appname/

    【讨论】:

      【解决方案6】:

      我有根据的猜测是,您看到的内存使用不是来自页面内容,而是来自加载 UIWebView 以及所有支持 WebKit 库的内容。我喜欢 UIWebView 控件,但它是一个“繁重”的控件,需要大量代码。

      此代码是 iOS Safari 浏览器的一个大型子集,可能会初始化大量静态结构。

      【讨论】:

      • 但是当我发布 webview 时它应该也释放缓存的内容......但它没有释放缓存的内容......如何删除缓存的数据
      • 阅读您的原始帖子,症状是您的内存使用量正在上升,但当您停止使用 UIWebView 时并没有下降。我的建议是内存使用不是缓存内容,而是 UIWebView 加载的代码和数据结构。检查您是否已发布 UIWebView 控件,而不仅仅是您显示的 Web 内容。
      【解决方案7】:

      经过各种尝试,只有这对我有用(在 ios 8 下):

      NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:1 diskCapacity:1 diskPath:nil];
      [NSURLCache setSharedURLCache:cache];
      

      【讨论】:

        【解决方案8】:

        对于 swift 2.0:

        let cacheSizeMemory = 4*1024*1024; // 4MB
        let cacheSizeDisk = 32*1024*1024; // 32MB
        let sharedCache = NSURLCache(memoryCapacity: cacheSizeMemory, diskCapacity: cacheSizeDisk, diskPath: "nsurlcache")
        NSURLCache.setSharedURLCache(sharedCache)
        

        【讨论】:

        • 这里设置单独的NSURLCache有什么用
        【解决方案9】:

        我正在从 Documents 加载 html 页面,如果它们具有相同的 css 文件名称UIWebView,它似乎不会抛出以前的 css 规则。可能是因为它们有相同的 URL 或其他东西。

        我试过了:

        NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
        [NSURLCache setSharedURLCache:sharedCache];
        [sharedCache release];
        

        我试过这个:

        [[NSURLCache sharedURLCache] removeAllCachedResponses];
        

        我正在加载初始页面:

        NSURLRequest *appReq = [NSURLRequest requestWithURL:appURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0];
        

        它拒绝抛出它的缓存数据!令人沮丧!

        我在 PhoneGap (Cordova) 应用程序中执行此操作。我没有在孤立的 UIWebView 中尝试过。

        更新1:我找到了this
        更改 html 文件,虽然看起来很乱。

        【讨论】:

        • Update2:我已经设法解决了这个问题。在提出新请求后,我还重新加载了 webview。由于某种原因,这会正确加载 css。
        • 嘿我知道这是旧的,但你是什么意思重新加载 webview?调用 [webview reload] 似乎没有任何作用,我和你一样,已经尝试了所有方法,不想在每个脚本和 css url 中添加随机字符串。
        • 那是 2012 年的 iOS6,可能黑客不再起作用了。加载后,我调用了重新加载。就是这样。
        猜你喜欢
        • 2013-02-09
        • 2011-02-01
        • 2013-07-24
        • 2013-09-09
        • 2015-03-22
        • 1970-01-01
        • 2012-05-25
        • 1970-01-01
        相关资源
        最近更新 更多