清除 UIWebview 缓存

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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 解决方法。 ***.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,可能黑客不再起作用了。加载后,我调用了重新加载。就是这样。

以上是关于清除 UIWebview 缓存的主要内容,如果未能解决你的问题,请参考以下文章

如何清除/禁用 UIWebView 的浏览历史记录

拨打电话和清除缓存

iOS - 在 WebView 中清除返回缓存

Swift中的UIWebView问题[重复]

iOS 清除 UIWebView 的回溯历史

如何清除 UIWebView/WKWebView 的内容?