背景
目前公司开发中,大力推崇原生和html5混合开发,这就必然会用到
webview
,最初使用的是最熟悉的UIwebVIew
,但是随着实际开发的进展,我发现UIWebView
的加载速度慢,而且对内存的消耗也比较大,我便开始寻找优化方法,在这一过程中,发现了自iOS 8.0以后,苹果官方推出的UIWebView
的替代品:WKWebView
。
WKWebView和UIWebView对比
- WKWebView支持更多html的特性;
- 官方宣称的高达60fps的滚动刷新率以及内置手势;
- 占用更少的内存;
- 将
UIWebViewDelegate
与UIWebView
拆分成了14类与3个协议,以前很多不方便实现的功能得以实现。官方文档; - Safari相同的JavaScript引擎;
通过对比,我们不难看出,WKWebView
的性能是优于UIWebView
的,而且为我们提供了更方便和html
交互的方法,所以,用WKWebView
代替UIWebView
还是很有必要的。下面我们来看一下WKWebView
的基本使用。
WKWebView的基本使用
WKWebView
的基本用法和UIWebView
并无太大区别,我们先看一下加载本地html
资源的代码:
//加载本地html资源
self.webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 64, SCREENW, SCREENH-64)];
NSString *filePath = [[NSBundle mainBundle]pathForResource:@"js-oc" ofType:@"html"];
NSString *htmlString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
[self.webView loadHTMLString:htmlString baseURL:[NSURL URLWithString:filePath]];
[self.view addSubview:self.webView];
加载网址的方法和UIWebView
也是基本类似的,来看Demo:
self.webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 64, SCREENW, SCREENH-64)];
NSString *urlStr = @"http://www.baidu.com";
NSURL *url = [NSURL URLWithString:urlStr];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[self.webView loadRequest:request];
WKWebView有两个代理:WKUIDelegate
和WKNavigationDelegate
。WKUIDelegate
主要处理JS脚本,确认框,警告框等,WKNavigationDelegate
主要处理一些跳转、加载处理操作。下面我们来看一下常用的代理方法:
#pragma mark - WKNavigationDelegate
//准备加载页面
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation
{
NSLog(@"webView provision to load!");
}
//已开始加载页面,可以在这一步向view中添加一个过渡动画
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation
{
NSLog(@"webView did start to load!");
}
//页面加载完成时调用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
{
NSLog(@"webView did finish!");
}
//页面准备加载失败时调用
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error
{
NSLog(@"webView did fail provision!");
}
//页面加载过程中失败
- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error
{
NSLog(@"webView did fail navigation!");
}
// 接收到服务器跳转请求之后调用
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation
{
NSLog(@"webView did receive service redirect for provision!");
}
// 在发送请求之前,决定是否跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
NSLog(@"webView decide policy for navigation action!");
NSLog(@"%@",navigationAction.request.URL.absoluteString);
NSLog(@"%ld",(long)navigationAction.navigationType);
//允许跳转
decisionHandler(WKNavigationActionPolicyAllow);
//不允许跳转
//decisionHandler(WKNavigationActionPolicyCancel);
}
// 在收到响应后,决定是否跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler
{
NSLog(@"webView decide policy for navigation response!");
NSLog(@"%@",navigationResponse.response.URL.absoluteString);
//允许跳转
decisionHandler(WKNavigationResponsePolicyAllow);
//不允许跳转
// decisionHandler(WKNavigationResponsePolicyCancel);
}
通过WKNavigationDelegate可以实现拦截url,通过判断navigationAction.navigationType
的类型,可以实现对html
页面跳转的控制,以及原生页面和html
页面之间的切换。
对于WKWebView
的简单实用就先记录这么多,下一篇文章再做进一步深入了解!
网友评论