之前公司项目不怎么使用到H5,即使使用到最多也是一个页面而已,因此虽然知道有WKWebView 但是也不怎么用。这次开发项目整整一个功能都要用H5的我就实用WKWebView和UIWebView对比了一下。以下是WKWebView 实用过程中遇到的问题。
首先图片对比UIWebView和WKWebView的内存对比 (显而易见)
以上是两者的对比差了三倍多,并且WKWebView的内存比较稳定,几乎都在60以下,但是UIWebView多的时候快200兆了,不多说了,直接上代码吧。我是用的WKWebView需要添加请求头,如果是你的项目是Cookie同步的话,也类似操作
1,遵守协议
<WKUIDelegate,WKNavigationDelegate>你没看错,是两个协议并且WKNationDelegate还是重要协议必写
2 方法 这个创建比较简单,复制的应该注意宏定义
self.MyWebView = [[WKWebViewalloc]initWithFrame:CGRectMake(0,0,SCREEN_WIDTH,SCREEN_HEIGHT-64)];
NSString * urlString =[NSStringstringWithFormat:@"%@%@",baseUrl,dataCountApi];
NSURL * url = [NSURLURLWithString:urlString];
NSMutableURLRequest * request = [NSMutableURLRequestrequestWithURL:url];
[request addValue:[GlobalDatatoken]forHTTPHeaderField:@"token"];
[self.MyWebViewloadRequest:request];
self.MyWebView.UIDelegate=self;
self.MyWebView.navigationDelegate=self;
[self.viewaddSubview:self.MyWebView];
3 协议 这个是重点,在UIWeb里边是直接用的request 但是在这里需要写上 navigationAction.出来的request
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
NSMutableURLRequest *mutableRequest = [navigationAction.requestmutableCopy];
NSDictionary *requestHeaders = navigationAction.request.allHTTPHeaderFields;
//我们项目使用的token同步的,cookie的话类似
if (requestHeaders[@"token"]) {
decisionHandler(WKNavigationActionPolicyAllow);//允许跳转
} else {
//这里添加请求头,把需要的都添加进来
[mutableRequest setValue:[GlobalDatatoken]forHTTPHeaderField:@"token"];
//这个我发现不能使用,于是我就直接不写了,但是下边的换了一种写法,结果都能达到同步
// navigationAction.request=[mutableRequest copy];
[webView loadRequest:mutableRequest];
decisionHandler(WKNavigationActionPolicyAllow);//允许跳转
}
}
- (void)backBtnClick:(UIButton *)sender
{
if ([self.MyWebViewcanGoBack]) {
[self.MyWebViewgoBack];
}else{
[self.viewresignFirstResponder];
[self.navigationControllerpopViewControllerAnimated:YES];
}
}