美文网首页
浅谈WKWebView的使用

浅谈WKWebView的使用

作者: 齐小天_Liu | 来源:发表于2017-03-27 11:51 被阅读131次

    背景

    目前公司开发中,大力推崇原生和html5混合开发,这就必然会用到webview,最初使用的是最熟悉的UIwebVIew,但是随着实际开发的进展,我发现UIWebView的加载速度慢,而且对内存的消耗也比较大,我便开始寻找优化方法,在这一过程中,发现了自iOS 8.0以后,苹果官方推出的UIWebView的替代品:WKWebView

    WKWebView和UIWebView对比

    • WKWebView支持更多html的特性;
    • 官方宣称的高达60fps的滚动刷新率以及内置手势;
    • 占用更少的内存;
    • UIWebViewDelegateUIWebView拆分成了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有两个代理:WKUIDelegateWKNavigationDelegateWKUIDelegate主要处理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的简单实用就先记录这么多,下一篇文章再做进一步深入了解!

    相关文章

      网友评论

          本文标题:浅谈WKWebView的使用

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