美文网首页
WKWebview 浅探

WKWebview 浅探

作者: 胖红Red | 来源:发表于2017-08-04 15:52 被阅读54次
    1.内存:在浏览网页的时候,UIWebview 内存增长迅速,而WKWebView 相对增长缓慢。
    WKWebview UIWebview WKWebview加载一段时间后内存的使用情况
    UIWebview加载一段时间后内存的使用情况
    2. 加载速度:WKWebview 加载速度比UIWebview 更快 更流畅 这个可以自己写一个demo 试试看
    3.wkwebview 的基本的创建
    WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
     config.userContentController = [[WKUserContentController alloc] init];
     [config.userContentController addScriptMessageHandler:self name:@"Native"];
    
     self.wkWebView = [[WKWebView alloc] initWithFrame:frame configuration:config];
        [_wkWebView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
        [_wkWebView setNavigationDelegate:self];
        [_wkWebView setUIDelegate:self];
        [_wkWebView setMultipleTouchEnabled:YES];
        [_wkWebView setAutoresizesSubviews:YES];
        [_wkWebView.scrollView setAlwaysBounceVertical:YES];
        _wkWebView.scrollView.bounces = NO;
        [self addSubview:self.wkWebView];
    
    4. 加载网页

    与 UIWebview相同 代码如下

    [self.wkWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]];
    
    5.加载的回调 (WKNavigationDelegate)

    加载过程:开始 完成 失败

     // 页面开始加载时调用
    - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:    (WKNavigation *)navigation;
    // 当内容开始返回时调用
    - (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation;
    // 页面加载完成之后调用
     - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;
    // 页面加载失败时调用
     - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation;
    

    页面跳转

    // 接收到服务器跳转请求之后调用
     - (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation;
    // 在收到响应后,决定是否跳转
    - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler;
    // 在发送请求之前,决定是否跳转
     - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
    
    6.警告框 (WKUIDelegate协议)

    web界面中有弹出警告框时调用

     webView           实现该代理的webview
     message           警告框中的内容
     frame             主窗口
     completionHandler 警告框消失调用
    
    - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(void (^)())completionHandler;
    
    7. js 处理

    在创建wkwebview 的时候,有一个js的注册方法:

      [config.userContentController addScriptMessageHandler:self name:@"Native"];
    

    然后在(WKScriptMessageHandler)里有一个方法做js的处理

     - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
          NSLog(@"JS 调用了 %@ 方法,传回参数 %@",message.name,message.body);
    }
    

    处理js

      - (void)handJS:(WKScriptMessage *)message {
    if ([message.name isEqualToString:@"Native"]) {
        NSLog(@"%@",message.body);
        //如果是自己定义的协议, 再截取协议中的方法和参数, 判断无误后在这里手动调用oc方法
        NSDictionary *param = [self queryStringToDictionary:message.body];
        NSLog(@"get param:%@",[param description]);
        
        NSString *func = [param objectForKey:@"func"];
        
        //调用本地函数
        if([func isEqualToString:@"callFunc"]) {
         ......
        }
    }
    }
    

    而UIWebview 处理js是:

      [self.webView evaluateJavaScript:javaScriptString completionHandler:completionHandler];
    

    UIWebview 做一些事件处理的话是:
    比如一个分享事件的案例:

      JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    
      context[@"shareMethod"] = ^() {
           //这里可做分享事件
        };
    
    8.清除缓存

    UIWebview

    [[NSURLCache sharedURLCache] removeAllCachedResponses];
    NSURLCache * cache = [NSURLCache sharedURLCache];
    [cache removeAllCachedResponses];
    [cache setDiskCapacity:0];
    [cache setMemoryCapacity:0];
    

    WKWebview

    iOS9 WKWebView新方法:点击查看参考链接

    NSSet *websiteDataTypes = [NSSet setWithArray:@[
                        WKWebsiteDataTypeDiskCache,
                        WKWebsiteDataTypeOfflineWebApplicationCache,
                        WKWebsiteDataTypeMemoryCache,
                        WKWebsiteDataTypeLocalStorage,
                        WKWebsiteDataTypeCookies,
                        WKWebsiteDataTypeSessionStorage,
                        WKWebsiteDataTypeIndexedDBDatabases,
                        WKWebsiteDataTypeWebSQLDatabases
                    ]];
    //你可以选择性的删除一些你需要删除的文件 or 也可以直接全部删除所有缓存的type  
    //NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes];
    NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];
    [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes   
    modifiedSince:dateFrom completionHandler:^{
       // �code
    }];
    

    注:在ios 8.0-9.0 之间可能会出现加载WKWebview 不显示的问题,可以在该VC 将要出现的时候:

    - (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    
    [self.navigationController  setNavigationBarHidden:NO];
    }

    相关文章

      网友评论

          本文标题:WKWebview 浅探

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