相信使用过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里通过注册把http和https请求交给NSURLProtocol处理。
[NSURLProtocol wk_registerScheme:@"http"];
[NSURLProtocol wk_registerScheme:@"https"];
到目前为止,可以说是大功告成了。关于这一方面的,想了解更多的请看iOS WKWebView (NSURLProtocol)拦截js、css,图片资源。
参考文献:
iOS WKWebView (NSURLProtocol)拦截js、css,图片资源
UIWebview使用缓存并且保证实时性
网友评论
[self.webView goBack];
} 大神 这个为啥是死循环
我是用的这个方法清缓存: [JWCacheURLProtocol setUpdateInterval:1]
- (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];
}
楼主,你看这样写可以吗?