WKWebViewの使用について

4343 ワード

背景
現在、会社の開発では、原生とhtml 5の混合開発を大いに推奨しています.これは必然的にwebviewを使用します.最初は最もよく知られているUIwebVIewを使用していましたが、実際の開発の進展に伴い、UIWebViewのロード速度が遅く、メモリの消費も大きいことに気づきました.私は最適化方法を探し始めました.この過程で、iOS 8.0以降、アップルが公式に発表したUIWebViewの代替品:WKWebView.
WKWebViewとUIWebViewの比較
  • WKWebViewはより多くのhtmlの特性をサポートします.
  • が公式に発表した60 fpsまでのスクロールリフレッシュ率と内蔵ジェスチャー.
  • は、より少ないメモリを消費します.
  • 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];
    

    URLをロードする方法も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には、WKUIDelegateWKNavigationDelegateの2つのエージェントがあります.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の簡単な実用については、まずこんなにたくさん記録して、次の文章は更に深く理解します!