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
JSコールOC
シナリオでブロック処理を行います.
WKWebView
OC呼び出しJS
WKWebView自身がJSコードを処理する方法を提供する
JSコールOC
JS側での操作
OCでの処理方法
具体的には
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つのフィールドが破棄される) 対ATSサポートが 未満
WKWebView loadRequest問題 WKWebView上でloadRequによって開始されたpost要求bodyデータが失われる
WKWebViewページスタイルの問題
WKWebViewのスクリーンショットの問題
WkWebView crashの問題
WKWebViewとUIWebViewの違い
ネットワーク最適化
WebViewJavascriptBridge
https://tech.meituan.com/WebViewPerf.html https://zhuanlan.zhihu.com/p/24990222 https://github.com/CheeryLau/WKWebView
UIWebViewはiOS 2からあり、WKWebViewはiOS 8からあり、WKWebViewが不器用なUIWebViewに取って代わることは間違いない.簡単なテストでは、UIWebViewがメモリを消費しすぎ、メモリのピークが誇張されていることがわかります.WKWebViewWebページのロード速度も向上していますが、メモリほど向上していません.その他のメリットを以下に示します.
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 。 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 :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問題
// ,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