iOS9WKWebView清除缓存

作者: Jason_逆 | 来源:发表于2016-05-10 15:16 被阅读19041次

自iOS8以来新出的WKWebView,大大优化了UIWebView的内存飙升问题,使得开发者迫不及待的用它来替换掉UIWebView,iOS8刚出,作者我就赶紧把项目里的webView都替换成WKWebView了,然而....当我替换完后发现...我去!WKWebView并没有清除缓存的功能,即使使用了以下代码:

NSHTTPCookie *cookie;

NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];

for (cookie in [storage cookies])

{

[storage deleteCookie:cookie];

}

NSURLCache * cache = [NSURLCache sharedURLCache];

[cache removeAllCachedResponses];

[cache setDiskCapacity:0];

[cache setMemoryCapacity:0];

WKWebView内的缓存,依旧没有清除掉,该有的Cookie还有,该有测cache还是存在!弄得小编我不是一般的郁闷,google,stackoverflow, 无果,最终还是沦落版本回退的下场~~~!

然而我们等到了iOS9!!!没错!WKWebView的缓存清除API出来了!代码如下:

这是删除所有缓存和cookie的

NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes];

//// Date from

NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];

//// Execute

[[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{

// Done

}];

当然,你也可以选择只删除部分

NSSet *websiteDataTypes

= [NSSet setWithArray:types];

//// All kinds of data

//NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes];

//// Date from

NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];

//// Execute

[[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{

// Done

}];

types是一个数组,可以放进数组的值为:

/*

WKWebsiteDataTypeDiskCache,

WKWebsiteDataTypeOfflineWebApplicationCache,

WKWebsiteDataTypeMemoryCache,

WKWebsiteDataTypeLocalStorage,

WKWebsiteDataTypeCookies,

WKWebsiteDataTypeSessionStorage,

WKWebsiteDataTypeIndexedDBDatabases,

WKWebsiteDataTypeWebSQLDatabases

*/

这样你就可以按你自己要求清除些什么啦!

(最后PS:WKWebView清除缓存只能iOS9使用,低于iOS9运行会崩溃哦!所以,为了适配iOS7和iOS8,还是要做版本判断,相信WKWebView取代UIWebView是指日可待的!)

相关文章

网友评论

  • LD_左岸:楼主觉得我这个问题和缓存有关系吗
    我用wkwebView加载链接1 在加完完成的代理中打印链接1最终的内容高度 打出来是1489
    我接着把wkwebview = nil
    再重新alloc init wk 去加载链接2 链接2的内容的真实高度 应该是130
    可有时候打印出来的是1489就是上个链接的内容的真实高度


    我都 = nil 了 这wk怎么还能把上个链接的高度返回给我呢........
    Jason_逆:这种情况,你可以在打印高度的同时打印一下webVIew的地址,看看2次打印是不是同一个地址,如果是,证明webView没被释放,另外,
    获取WKWebView内容高度一般采用调用js的方式去获取,如:
    [self.webView evaluateJavaScript:@"document.getElementsByTagName('html')[0].offsetHeight" completionHandler:^(id _Nullable result,NSError *_Nullable error) {
    NSLog(@"文本高度:%@", result);
    }];
    还有另外一种方式就是你可以用KVO监听WebView.scrollview.contentSize
  • c6434e560144:楼主知道iOS9 怎么计算缓存的大小吗
  • ZQQ_iOS:这些清缓存的方法,我放在什么地方调用呢?放在- (void)dealloc,没有更新
  • 菊上一枝梅:然而这样并不好使
  • 柏林日记:楼主我用这样的方法清理缓存,发现每次js还是有残留,怎么回事
    ZQQ_iOS:你后来用什么来清缓存
  • macfai:iOS8系统楼主有什么好办法能清除缓存吗
    888zq:@Kely_Developer 你确定可以删除掉缓存 ,我的这样写的 为啥返回的时候不去重新加载html文件
    Kely_Developer:既然是缓存 那么必然是缓存到沙盒中的 这样只要找到iOS8系统下web的缓存路径 然后删除这个路径即可 windown->Devices->installed Apps(选中你的app)->齿轮状图标Download...下载你的app沙盒文件 具体代码参考:
    NSString *libraryDir = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask, YES)[0];
    NSString *bundleId = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"];
    NSString *webkitFolderInLib = [NSString stringWithFormat:@"%@/WebKit",libraryDir];
    NSString *webKitFolderInCaches = [NSString stringWithFormat:@"%@/Caches/%@/WebKit",libraryDir,bundleId];
    NSError *error;
    [[NSFileManager defaultManager] removeItemAtPath:webKitFolderInCaches error:&error];
    [[NSFileManager defaultManager] removeItemAtPath:webkitFolderInLib error:nil];
  • iOS_凯:楼主呀,那个WKWebView怎么实现缓存的功能呢,就是第一次加载网页之后,第二次打开就不用加载直接打开呢,或者断网情况下也可以打开,可以实现吗
    小朴同学:默认已经缓存了。第一次打开一个网页,下次断网后也能打开的
    iOS_凯:@Jason_逆 多谢了,缓存应该就是这点作用吧,要不然留着缓存干啥
    Jason_逆:@iOS_凯 这个我没有试过…你可以试下把网页下载下来用data存着,下次打开的时候判断有没这个data,有就用load data那个方法试试

本文标题:iOS9WKWebView清除缓存

本文链接:https://www.haomeiwen.com/subject/srxchttx.html