WKWebView的缓存

作者: 脚踏实地的小C | 来源:发表于2017-11-30 10:35 被阅读1750次

      相信使用过webView的人都挺烦每次都有一段空白期,用户体验感极差,所以公司要求在webView上增加缓存,废话不多说了,进入正题!

    1.使用WKWebView

        // 1.简单创建WKWebView
        WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height - 20)];
        webView.navigationDelegate = self;
        [self.view addSubview:webView];
        // 2.创建请求
        NSURL *URL = [NSURL URLWithString:@"xxxxxxxxx"];
        NSURLRequest *request = [[NSURLRequest alloc] initWithURL:URL];
        // 3.加载网页
        [webView loadRequest:request];
    

    2.最重要的部分来了,重写NSURLProtocol

    思路逻辑:

      使用webView加载页面的时候,如果有缓存,就先加载缓存,没有就请求网络,然后使用系统自带的缓存方式存储;当重新请求网络,就算下与最近一次网络请求相隔有没一个小时,有的话就重新请求网络。这边借用下一大神的图片

    cache策略.png
    我们这边继续使用大神写好的一个自定义的NSURLProtocol
    使用方法是:

    1、pod 'JWNetAutoCache'

    2、在需要开启的时候调用

    [JWCacheURLProtocol startListeningNetWorking];
    

    3、使用结束后调用:

    [JWCacheURLProtocol cancelListeningNetWorking];
    

    然而这个对于WKWebView来说,它是不走NSURLProtocol的,看到这,惊不惊喜,意不意外!!!不过别急,离成功就差一步了。当然,关于UIWebView的更详细操作请看UIWebview使用缓存并且保证实时性,

    3.让WKWebView走NSURLProtocol

      在 WKWebView 中的请求只是象征性走

    + (BOOL) canInitWithRequest:(NSURLRequest *)request 
    

    之后的整个请求流程似乎就与 NSURLProtocol 完全无关了,但是在UIWwbView中确是正常的,不过由于我之前在WKWebView的代理中实现了一些东西,所以没改变使用WKWebView。一开始一脸懵逼,不懂为啥,不过幸亏在一大神那得到了解决方法,由于大神说的很详细,所以我这边就不重述了(呼呼,其实是我自己也讲不太清楚)。

    下面来操作一番:

    1、先下载一大神写的NSURLProtocold的分类NSURLProtocol+WKWebVIew

    2、然后在viewDidLoad里通过注册把httphttps请求交给NSURLProtocol处理。

    [NSURLProtocol wk_registerScheme:@"http"];
    [NSURLProtocol wk_registerScheme:@"https"];
    

    到目前为止,可以说是大功告成了。关于这一方面的,想了解更多的请看iOS WKWebView (NSURLProtocol)拦截js、css,图片资源

    参考文献:
    iOS WKWebView (NSURLProtocol)拦截js、css,图片资源
    UIWebview使用缓存并且保证实时性

    相关文章

      网友评论

      • Hunter琼:我这边界面不支持缓存的 然后用NSURLProtocol的方法 界面需要sso 登录切换 我用它 第一次登录 是第一次登录号,切换成另外一个号码 ,进入还是上一个的号码 是不是退出登录 就要把缓存干掉???
        脚踏实地的小C:@Hunter琼 你有没在其他地方把canGoBack这个值置为否呢?
        Hunter琼:@深漂的小C while (self.webView.canGoBack) {

        [self.webView goBack];


        } 大神 这个为啥是死循环
        脚踏实地的小C:@Hunter琼 按我的理解,是要的
      • 币乎iOS:WKWebView清空缓存好像没有作用,
        我是用的这个方法清缓存: [JWCacheURLProtocol setUpdateInterval:1]
        脚踏实地的小C:@一名怀揣梦想的落魄屌丝 网上另外找到一个https://www.jianshu.com/p/f4aa6ff9ff9e,你可以试试看
        币乎iOS:@深漂的小C 调用了该方法 但是缓存没有清除
        脚踏实地的小C:我觉得你可以调用下clearUrlDict,清除内存中的URL记录,重新缓存
      • 一杯红酒mm:如果我当前网络请求失败了。那岂不是得等到一个小时之后再才能重新刷新界面,也是是说这一个小时内都是现实网络请求失败的这个界面。
        脚踏实地的小C:刚刚看了下,那个你可以自己重新设置 啊,它只是默认一个小时而已,你可以改成几秒就好
        脚踏实地的小C::joy: 你是从哪里看到要这么久???
      • Miaoz0070:楼主,你本地拦截后,h5的post请求可以请求吗?
        脚踏实地的小C:@Miaoz0070 你说的拦截是指???
      • 余默_d467:大神你好,我用你的方法测试过,当我在webview输入账号密码的时候一直有出现问题,h5端一直提示账号为空
        遠遊旳遊子:而且,如果网络突然断网,加载的数据没有完整时,联网后重新加载出现了总是加载失败的那个页面的缓存的问题
        遠遊旳遊子:我的测试使用时也出现了账号密码输入登录时总是提示账号密码错误,但我使用的是内部的测试用的账号密码,都很简单,也输入了多次,不可能出错的呀
        脚踏实地的小C:这个我还真没遇到过,我这边账号填写什么的是正常,你看下你们公司的web端那怎么说。
      • macfai:楼主你好,我刚试了一下,在wkwebView 中貌似不可以啊,能给指导一下吗?万分感谢
        macfai:@深漂的小C
        - (void)viewDidLoad {

        [super viewDidLoad];

        //使用方法,在开启webview的时候开启监听,,销毁weibview的时候取消监听,否则监听还在继续。将会监听所有的网络请求
        [JWCacheURLProtocol startListeningNetWorking];

        [NSURLProtocol wk_registerScheme:@"http"];
        [NSURLProtocol wk_registerScheme:@"https"];

        WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height - 20)];
        webView.navigationDelegate = self;
        [self.view addSubview:webView];
        // 2.创建请求
        NSURL *URL = [NSURL URLWithString:@"https://m.jd.com";];
        NSURLRequest *request = [[NSURLRequest alloc] initWithURL:URL];
        // 3.加载网页
        [webView loadRequest:request];

        // UIWebView *webview = [[UIWebView alloc] initWithFrame:self.view.bounds];
        // [self.view addSubview:webview];
        // NSURL *URL = [NSURL URLWithString:@"https://m.jd.com";];
        // NSURLRequest *request = [[NSURLRequest alloc] initWithURL:URL];
        // [webview loadRequest:request];

        }

        楼主,你看这样写可以吗?
        macfai:@深漂的小C 楼主,你好,能加个微信或者qq吗?我的qq 498665232,想就一些代码细节和楼主沟通一下,多谢了。
        脚踏实地的小C:你是怎么修改呢????
      • macfai:楼主,你好,我看JWNetAutoCache的github介绍是对UIWebView的缓存处理,同样适用于WKWebView 吗?楼主是亲测的吗?跪求指教
        脚踏实地的小C:楼主亲测的,是可以的。你是哪里不可以???
      • c2fffd2b0090:js css 在本地 ,只发送网络请求获取数据回来,渲染 。这个使用咩??
        脚踏实地的小C:不好意思,这个还真没有,如果有相关资料欢迎分享哈。
      • 曼谷第一开膛手:缓存策略在JWNetAutoCache里面吗
        脚踏实地的小C:是的,缓存的都在那里面

      本文标题:WKWebView的缓存

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