WKWebView

作者: 一生信仰 | 来源:发表于2018-05-04 14:57 被阅读1次

    WebKit中更新的WKWebView控件的新特性与使用方法,它很好的解决了UIWebView存在的内存、加载速度等诸多问题。

    一、WKWebView新特性

    在性能、稳定性、功能方面有很大提升(最直观的体现就是加载网页是占用的内存:

    • 允许JavaScript的Nitro库加载并使用(UIWebView中限制);

    • 支持了更多的HTML5特性;

    • 高达60fps的滚动刷新率以及内置手势;

    将UIWebViewDelegate与UIWebView重构成了14类与3个协议查看苹果官方文档

    二、WebKit框架概览


    WebKit概览.png

    WebKit的14类与3个协议

    WKWebView:网页的渲染与展示,通过WKWebViewConfiguration可以进行自定义配置。
    
    WKWebViewConfiguration:这个类专门用来配置WKWebView。
    
    WKPreference:这个类用来进行相关webView设置。
    
    WKProcessPool:这个类用来配置进程池,与网页视图的资源共享有关。
    
    WKUserContentController:这个类主要用来做native与JavaScript的交互管理。
    
    WKUserScript:用于进行JavaScript注入。
    
    WKScriptMessageHandler:这个类专门用来处理JavaScript调用native的方法。
    
    WKNavigationDelegate:网页跳转间的导航管理协议,这个协议可以监听网页的活动。
    
    WKNavigationAction:网页某个活动的示例化对象。
    
    WKUIDelegate:用于交互处理JavaScript中的一些弹出框。
    
    WKBackForwardList:堆栈管理的网页列表。
    
    WKBackForwardListItem:每个网页节点对象。
    

    初始化webView

    webView = [[WKWebView alloc] initWithFrame:self.view.bounds];
    //WKUIDelegate
    webView.UIDelegate = self;
    //WKNavigationDelegate
    webView.navigationDelegate = self;
    //UIScrollViewDelegate
    webView.scrollView.delegate = self;
    //允许侧滑返回
    webView.allowsBackForwardNavigationGestures = true;
    
    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]];
    
    
    //监听webView的相关属性
    //监听是否存在二级页面
    [webView addObserver:self forKeyPath:@"canGoBack" options:NSKeyValueObservingOptionNew context:nil];
    
    //监听加载进度
    [webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];
    
    

    WKUIDelegate

    //Alert弹窗代理
    -(void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler{
    }
    
    //Confirm按钮点击代理
    -(void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler{
    }
    
    // 输入框代理
    -(void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable))completionHandler{
        completionHandler(@"runJavaScriptTextInputPanelWithPrompt");
        NSLog(@"runJavaScriptTextInputPanelWithPrompt");
    }
    

    WKNavigationDelegate

    - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
        //是否允许发起请求
        decisionHandler(WKNavigationActionPolicyAllow);
    }
    
    - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{
        //是否允许接收数据响应
        decisionHandler(WKNavigationResponsePolicyAllow);
    }
    
    - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(null_unspecified WKNavigation *)navigation{
        //开始网页请求
        NSLog(@"didStartProvisionalNavigation");
    }
    
    - (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(null_unspecified WKNavigation *)navigation{
        //链接重定向
        NSLog(@"didReceiveServerRedirectForProvisionalNavigation");
    }
    
    - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error{
        //请求失败、请求出错
        NSLog(@"didFailProvisionalNavigation");
    }
    
    - (void)webView:(WKWebView *)webView didCommitNavigation:(null_unspecified WKNavigation *)navigation{
        //接收到请求数据
        NSLog(@"didCommitNavigation");
    }
    - (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation{
        //成功完成请求
        NSLog(@"didFinishNavigation = %@",webView.backForwardList.backItem.title ? : @"首页");
    }
    

    WKScriptMessageHandler

    - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
    }
    

    原生App和JS交互

    1. js调用原生方法
    //注册本地原生方法供h5 webkit 唤起
    [webView.configuration.userContentController addScriptMessageHandler:self name:@"say_hello"];
    
    //MARK: - WKScriptMessageHandler(回调处理)
    - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
        
    }
    
    2. 原生调用js方法

    webview 的evaluateJavaScript方法,参数为所调用H5函数的函数名及所需参数

    NSDictionary *para = @{@"name":@"detail",@"type":@"2"};
    NSError *error;
    NSData *paraData = [NSJSONSerialization dataWithJSONObject:para options:0 error:&error];
    NSString *paraStr = [[NSString alloc] initWithData:paraData encoding: NSUTF8StringEncoding];
    NSString *funcStr = [NSString stringWithFormat:@"hello(%@)",paraStr];
    
    //调用js function
    [webView evaluateJavaScript:funcStr completionHandler:^(id _Nullable result, NSError * _Nullable error) {
    }];
    

    相关文章

      网友评论

        本文标题:WKWebView

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