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