WKWebViewとUIWebViewの比較

4091 ワード

WKWebViewとUIWebView
UIWebViewはiOS 2からあり、WKWebViewはiOS 8からあり、WKWebViewが不器用なUIWebViewに取って代わることは間違いない.簡単なテストでは、UIWebViewがメモリを消費しすぎ、メモリのピークが誇張されていることがわかります.WKWebViewWebページのロード速度も向上していますが、メモリほど向上していません.その他のメリットを以下に示します.
  • より多くのHTML 5をサポートする機能
  • 公式に発表された60 fpsまでのスクロールリフレッシュ率と内蔵ジェスチャー
  • Safari同じJavaScriptエンジン
  • UIWebViewDelegateとUIWebViewを14クラスと3つのプロトコル(公式ドキュメントの説明)
  • に分割
  • 別途使用することが多く、ロード進捗属性を追加する:estimatedProgress
  • UIWebView
    OC呼び出しJS
    - (nullable NSString *)stringByEvaluatingJavaScriptFromString:
    

    JSコールOC
     Native     , - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest:)request navigationType:(UIWebViewNavigationType)navigationType
    

    シナリオでブロック処理を行います.
    WKWebView
    OC呼び出しJS
    - (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^_Nullable)(_Nullable id,NSError * _Nullable error))completionHandler;
    

    WKWebView自身がJSコードを処理する方法を提供する
    - (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^ _Nullable)(_Nullable id, NSError * _Nullable error))completionHandler;
    

    JSコールOC
    JS側での操作
    window.webkit.messageHandlers..postMessage()
    

    OCでの処理方法
    - (void)addScriptMessageHandler:(id)scriptMessageHandler name:(NSString *)name;
    

    具体的には
    //  addScriptMessageHandler name.           
    [[_webView configuration].userContentController addScriptMessageHandler:self name:@"   "];
    
    //WKScriptMessageHandler    
    - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
        //code
    }
    

    selfのdeallocでブレークポイントを打つと、selfが解放されていないことがわかります.これはだめです.構想は、別のエージェントオブジェクトを作成し、エージェントオブジェクトを介して指定したselfをコールバックすることです.
    https://github.com/CheeryLau/WKWebView
    WKWebViewピット
    WKWebViewホワイトスクリーンの問題
    WKWevView Cookie問題
    WKWebView NSURLProtocol問題
  • WKWebViewは、appプロセスとは独立したプロセスでネットワーク要求を実行し、要求データはメインプロセスを経ないため、WKWebView上でNSURLProtocolを直接使用して要求をブロックすることはできません.
  • post要求bodyデータがクリア(encodeの場合HTTPBodyとHTTPBodyStreamの2つのフィールドが破棄される)
  •    WKWebView             。     http(s) scheme  ,       Network Process     App Process,   NSURLProtocol         。  webkit2        MessageQueue          ,Network Process      encode     Message,     IPC     App Process。       ,encode     HTTPBody   HTTPBodyStream           (      :
    https://github.com/WebKit/webkit/blob/fe39539b83d28751e86077b173abd5b7872ce3f9/Source/WebKit2/Shared/mac/WebCoreArgumentCodersMac.mm#L61-L88  bug report: )。
    
  • 対ATSサポートが
  • 未満
            ATS  :Allow Arbitrary Loads      NO,     registerSchemeForCustomProtocol     http(s) scheme,WKWebView       http         (   Allow Arbitrary Loads in Web Content      YES);
    WKWebView      customScheme,    dynamic://,                post           customScheme     ,   dynamic://http://www.dynamicalbumlocalimage.com/,    app    NSURLProtocol              。  :   post              ,     H5       scheme    CSP   
    

    WKWebView loadRequest問題
  • WKWebView上でloadRequによって開始されたpost要求bodyデータが失われる
  • //              ,HTTPBody     
     [request setHTTPMethod:@"POST"];
     [request setHTTPBody:[@"bodyData" dataUsingEncoding:NSUTF8StringEncoding]];
     [wkwebview loadRequest: request]
    

    WKWebViewページスタイルの問題
    WKWebViewのスクリーンショットの問題
    WkWebView crashの問題
    WKWebViewとUIWebViewの違い
    WKWebView   (         UIWebView  1/3~1/4),    ,         UIWebViewDelegate     。
             WKWebView     ,     Google,                  UIWebView
    

    ネットワーク最適化
    WebViewJavascriptBridge
    https://tech.meituan.com/WebViewPerf.html https://zhuanlan.zhihu.com/p/24990222 https://github.com/CheeryLau/WKWebView