iOS-WKWebView

5208 ワード

UIWebViewはメモリの消費量が多すぎて、メモリのピークはさらに誇張されています.WKWebViewWebページのロード速度も向上
1、HTML 5の機能をより多くサポートする2、公式に発表された60 fpsまでのスクロールリフレッシュ率、および内蔵ジェスチャー3、Safariと同じJavaScriptエンジンを内蔵し、JavaScriptのNitroライブラリのロードと使用を許可する(UIWebViewで制限されている).4、UIWebViewDelegateとUIWebViewを14種類と3つのプロトコル(公式ドキュメントの説明)5に分割し、より少ないメモリを占有し、性能、安定性、機能の面で大きな向上を遂げた.
ロードの進捗プロパティが追加されました:estimatedProgress
まずWebKitライブラリの導入が必要です
WKWebViewには2つのdelegateがあり、
  • WKUIDelegate
  • WKNavigationDelegate. WKNavigationDelegateは主にいくつかのページのジャンプ、ロード処理操作を処理し、WKUIdelegateは主にJSスクリプト、確認ボックス、警告ボックスなどを処理する.
  • //      
        - (instancetype)initWithFrame:(CGRect)frame;
        //    webview     ,     
        - (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration NS_DESIGNATED_INITIALIZER;
    

    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{
         
        NSLog(@"%@",navigationResponse.response.URL.absoluteString);
        //    
        decisionHandler(WKNavigationResponsePolicyAllow);
        //     
        //decisionHandler(WKNavigationResponsePolicyCancel);
    }
    //        ,      
    - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
         
        NSLog(@"%@",navigationAction.request.URL.absoluteString);
        //    
        decisionHandler(WKNavigationActionPolicyAllow);
        //     
        //decisionHandler(WKNavigationActionPolicyCancel);
    }
    

    WKUIDelegate
    #pragma mark - WKUIDelegate
    //       WebView
    - (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures{
        return [[WKWebView alloc]init];
    }
    //    
    - (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler{
        completionHandler(@"http");
    }
    //    
    - (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler{
        completionHandler(YES);
    }
    //    
    - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler{
        NSLog(@"%@",message);
        completionHandler();
    }
    

    WKWebViewとJSのインタラクション:
    スクリプト情報に直訳して、本明細書ではJSイベントとする)に対するリスニングを直接追加することで、JS呼び出しOCを実現することができる.すべての操作はWKUSerContentControllerで処理されます
    WKUSerContentControlの入手方法
    WKUserContentControllerはWKWebViewのプロパティであり、WKWebViewはWKWebViewのプロパティ(つまりWKWebViewがインスタンス化されたときに伝わるconfiguration)である
    WKUserContentController *conntentController = self.webView.configuration.userContentController;
    
    

    JSコールOC:
    まずJSコードにあらかじめ約束したScriptMessage(JSイベント)への呼び出しwindowを加える.webkit.messageHandlers..postMessage(転送が必要なデータ)OC側に@"closeWindow"というJSの傍受を追加する:
    [conntentController addScriptMessageHandler:self name:@"closeWindow"];
    [conntentController removeScriptMessageHandlerForName:@"closeWindow"];
    

    OC呼び出しJS:
    // UIWebView  WKWebView     JS  
    [self.webView evaluateJavaScript:@"function('action')" completionHandler:nil];
    
    

    HTTPをサポートする:
    NSAppTransportSecurity
        
              NSAllowsArbitraryLoads
              
        
    

    ローカルhtmlをロードするには:
    NSURL *filePath = [[NSBundle mainBundle] URLForResource:@"www/index.html" withExtension:nil]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:filePath];
    [_wkWebView loadRequest:request];
    
    

    HTMLをロードして表示しない
    NSString *path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"WebFile"];
    
            :        
    
    

    参照先:https://www.jianshu.com/p/4fa8c4eb1316 http://www.cocoachina.com/ios/20171019/20849.html http://www.cocoachina.com/ios/20170908/20518.html https://www.jianshu.com/p/870dba42ec15