WKWebView和UIWebView對(duì)比

WKWebView和UIWebView

UIWebView自iOS2就有,WKWebView從iOS8才有警医,毫無(wú)疑問(wèn)WKWebView將逐步取代笨重的UIWebView。通過(guò)簡(jiǎn)單的測(cè)試即可發(fā)現(xiàn)UIWebView占用過(guò)多內(nèi)存,且內(nèi)存峰值更是夸張。WKWebView網(wǎng)頁(yè)加載速度也有提升孽亲,但是并不像內(nèi)存那樣提升那么多。下面列舉一些其它的優(yōu)勢(shì):

  • 更多的支持HTML5的特性
  • 官方宣稱(chēng)的高達(dá)60fps的滾動(dòng)刷新率以及內(nèi)置手勢(shì)
  • Safari相同的JavaScript引擎
  • 將UIWebViewDelegate與UIWebView拆分成了14類(lèi)與3個(gè)協(xié)議(官方文檔說(shuō)明)
  • 另外用的比較多的肄扎,增加加載進(jìn)度屬性:estimatedProgress

UIWebView

OC調(diào)用JS

- (nullable NSString *)stringByEvaluatingJavaScriptFromString:

JS調(diào)用OC

讓Native 代碼攔截墨林, - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest:)request navigationType:(UIWebViewNavigationType)navigationType

方案中進(jìn)行攔截處理赁酝。

WKWebView

OC調(diào)用JS

- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^_Nullable)(_Nullable id,NSError * _Nullable error))completionHandler;

WKWebView 本身提供一個(gè)方法進(jìn)行處理JS代碼

- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^ _Nullable)(_Nullable id, NSError * _Nullable error))completionHandler;

JS調(diào)用OC

在JS端的操作

window.webkit.messageHandlers.<方法名>.postMessage(<數(shù)據(jù)>)

在OC中的處理方法

- (void)addScriptMessageHandler:(id<WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name;

具體如下

//設(shè)置addScriptMessageHandler與name.并且設(shè)置<WKScriptMessageHandler>協(xié)議與協(xié)議方法
[[_webView configuration].userContentController addScriptMessageHandler:self name:@"方法名"];

//WKScriptMessageHandler協(xié)議方法
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
    //code
}

如果你在self的dealloc打個(gè)斷點(diǎn)犯祠,會(huì)發(fā)現(xiàn)self沒(méi)有釋放,這顯示是不行的酌呆。
思路是另外創(chuàng)建一個(gè)代理對(duì)象衡载,然后通過(guò)代理對(duì)象回調(diào)指定的self。

https://github.com/CheeryLau/WKWebView

WKWebView 坑

WKWebView 白屏問(wèn)題

WKWevView Cookie 問(wèn)題

WKWebView NSURLProtocol問(wèn)題

  • WKWebView 在獨(dú)立于app進(jìn)程之外的進(jìn)程中執(zhí)行網(wǎng)絡(luò)請(qǐng)求隙袁,請(qǐng)求數(shù)據(jù)不經(jīng)過(guò)主進(jìn)程痰娱,因此弃榨,在WKWebView上直接使用NSURLProtocol無(wú)法攔截請(qǐng)求。
  • post 請(qǐng)求body 數(shù)據(jù)被清空(encode的時(shí)候HTTPBody和HTTPBodyStream 這兩個(gè)字段被丟棄了)
由于 WKWebView 在獨(dú)立進(jìn)程里執(zhí)行網(wǎng)絡(luò)請(qǐng)求梨睁。一旦注冊(cè) http(s) scheme 后鲸睛,網(wǎng)絡(luò)請(qǐng)求將從 Network Process 發(fā)送到 App Process,這樣 NSURLProtocol 才能攔截網(wǎng)絡(luò)請(qǐng)求坡贺。在 webkit2 的設(shè)計(jì)里使用 MessageQueue 進(jìn)行進(jìn)程之間的通信官辈,Network Process 會(huì)將請(qǐng)求 encode 成一個(gè) Message,然后通過(guò) IPC 發(fā)送給 App Process。出于性能的原因遍坟,encode 的時(shí)候 HTTPBody 和 HTTPBodyStream 這兩個(gè)字段被丟棄掉了(參考蘋(píng)果源碼:
https://github.com/WebKit/webkit/blob/fe39539b83d28751e86077b173abd5b7872ce3f9/Source/WebKit2/Shared/mac/WebCoreArgumentCodersMac.mm#L61-L88 及bug report: <WKWebView does not fully support custom NSURLProtocol>)拳亿。
  • 對(duì)ATS支持不足
測(cè)試發(fā)現(xiàn)一旦打開(kāi)ATS開(kāi)關(guān):Allow Arbitrary Loads 選項(xiàng)設(shè)置為NO,同時(shí)通過(guò) registerSchemeForCustomProtocol 注冊(cè)了 http(s) scheme愿伴,WKWebView 發(fā)起的所有 http 網(wǎng)絡(luò)請(qǐng)求將被阻塞(即便將Allow Arbitrary Loads in Web Content 選項(xiàng)設(shè)置為YES)肺魁;
WKWebView 可以注冊(cè) customScheme, 比如 dynamic://, 因此希望使用離線(xiàn)功能又不使用 post 方式的請(qǐng)求可以通過(guò) customScheme 發(fā)起請(qǐng)求,比如 dynamic://http://www.dynamicalbumlocalimage.com/隔节,然后在 app 進(jìn)程 NSURLProtocol 攔截這個(gè)請(qǐng)求并加載離線(xiàn)數(shù)據(jù)鹅经。不足:使用 post 方式的請(qǐng)求該方案依然不適用,同時(shí)需要 H5 側(cè)修改請(qǐng)求 scheme 以及 CSP 規(guī)則

WKWebView loadRequest 問(wèn)題

  • 在WKWebView 上通過(guò)loadRequ發(fā)起的post請(qǐng)求body數(shù)據(jù)被丟失
//同樣是由于進(jìn)程間通信性能問(wèn)題怎诫,HTTPBody字段被丟棄
 [request setHTTPMethod:@"POST"];
 [request setHTTPBody:[@"bodyData" dataUsingEncoding:NSUTF8StringEncoding]];
 [wkwebview loadRequest: request]

WKWebView 頁(yè)面樣式問(wèn)題

WKWebView 截屏問(wèn)題

WkWebView crash 問(wèn)題

WKWebView和UIWebView 的區(qū)別

WKWebView 更快(占用內(nèi)存可能只有 UIWebView 的1/3~1/4)瞬雹,沒(méi)有緩存,更為細(xì)致地拆分了 UIWebViewDelegate 中的方法刽虹。
想要了解更多關(guān)于 WKWebView 的特性的酗捌,可以自行 Google,這里你可以簡(jiǎn)單地把它當(dāng)做是輕量級(jí)的 UIWebView

網(wǎng)絡(luò)優(yōu)化

WebViewJavascriptBridge

https://tech.meituan.com/WebViewPerf.html
https://zhuanlan.zhihu.com/p/24990222
https://github.com/CheeryLau/WKWebView

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涌哲,一起剝皮案震驚了整個(gè)濱河市胖缤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌阀圾,老刑警劉巖哪廓,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異初烘,居然都是意外死亡涡真,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)肾筐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)哆料,“玉大人,你說(shuō)我怎么就攤上這事吗铐《啵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵唬渗,是天一觀的道長(zhǎng)典阵。 經(jīng)常有香客問(wèn)我奋渔,道長(zhǎng),這世上最難降的妖魔是什么壮啊? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任嫉鲸,我火速辦了婚禮,結(jié)果婚禮上歹啼,老公的妹妹穿的比我還像新娘充坑。我一直安慰自己,他們只是感情好染突,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布捻爷。 她就那樣靜靜地躺著,像睡著了一般份企。 火紅的嫁衣襯著肌膚如雪也榄。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天司志,我揣著相機(jī)與錄音甜紫,去河邊找鬼。 笑死骂远,一個(gè)胖子當(dāng)著我的面吹牛囚霸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播激才,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼拓型,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了瘸恼?” 一聲冷哼從身側(cè)響起劣挫,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎东帅,沒(méi)想到半個(gè)月后压固,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡靠闭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年帐我,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片愧膀。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拦键,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扇调,到底是詐尸還是另有隱情矿咕,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布狼钮,位于F島的核電站碳柱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏熬芜。R本人自食惡果不足惜莲镣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涎拉。 院中可真熱鬧瑞侮,春花似錦、人聲如沸鼓拧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)季俩。三九已至钮糖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酌住,已是汗流浹背店归。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酪我,地道東北人消痛。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像都哭,于是被迫代替她去往敵國(guó)和親秩伞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容