清除 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 缓存的主要内容,如果未能解决你的问题,请参考以下文章