WKWebView實踐與詳解

iOS8之后一疯,Apple推出了最新的WKWebView柔纵,經(jīng)歷了若干代的發(fā)展之后眼坏,WKWebView日趨完善,在目前的開發(fā)項目當(dāng)中也得到了充分的使用地粪。

為什么使用WKWebView取募?

因為老舊的UIWebView存在嚴(yán)重的性能和內(nèi)存消耗問題,限制了業(yè)務(wù)的自由度蟆技。WKWebView 采用跨進程方案玩敏,Nitro JS 解析器斗忌,高達 60fps 的刷新率,理論上性能和 Safari 比肩旺聚,而且對 H5 的高度支持织阳。

由于WKWebView使用跨進程方案,不會增加app的使用內(nèi)存砰粹,所以保證了比較好的性能和體驗唧躲。如圖所示,進程分布碱璃。


屏幕快照 2018-07-02 下午3.21.10.png

UIWebView和WKWebView的流程區(qū)別

屏幕快照 2018-07-02 下午3.22.33.png

如圖所示弄痹,WKWebView的流程粒度更加細灸撰,不但在請求的時候會詢問WKWebView是否請求數(shù)據(jù)唆垃,還會在返回數(shù)據(jù)之后詢問WKWebView是否加載數(shù)據(jù)。

#請求數(shù)據(jù)的時候詢問
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
#返回數(shù)據(jù)的時候詢問
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler;

在流程中杨伙,WKWebView返回的錯誤粒度也比UIWebView細爽航,如代碼所示:

#請求數(shù)據(jù)時發(fā)生的error
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error;
#請求之后加載H5發(fā)生的error
- (void)webView:(WKWebView *)webView didFailNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error;

深入JavaScript與Native

JavaScript與Native之間的交互一直是Web與Native的重要行為蚓让,在WKWebView中,JavaScript與Native的交互還是很優(yōu)雅的讥珍。

Native調(diào)用JavaScript

#pragma mark - UIWebView
NSString *title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
#pragma mark - WKWebView
[wkWebView evaluateJavaScript:@"document.title"
            completionHandler:^(id _Nullable ret, NSError * _Nullable error) {
    NSString *title = ret;
}];

WKWebView 提供的接口和 UIWebView 命名上較為類似历极,區(qū)別是 WKWebView 的這個接口是異步的,而 UIWebView 是同步接口

JavaScript調(diào)用Native

WKWebView 綁定共享對象衷佃,是通過特定的構(gòu)造方法實現(xiàn)趟卸,參考代碼,通過指定 UserContentController 對象的 ScriptMessageHandler 經(jīng)過 Configuration 參數(shù)構(gòu)造時傳入纲酗。

WKUserContentController *userContent = [[WKUserContentController alloc] init];
[userContent addScriptMessageHandler:id<WKScriptMessageHandler> name:@"MyNative"];
    
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.userContentController = userContent;
    
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:config];

通過addScriptMessageHandler:name:指代實現(xiàn)WKScriptMessageHandler協(xié)議的對象衰腌,以及被js調(diào)用的方法名稱新蟆,結(jié)束是需要移除觅赊。

而handler 對象需要實現(xiàn)指定協(xié)議,實現(xiàn)指定的協(xié)議方法琼稻,當(dāng) JS 端通過  window.webkit.messageHandlers 發(fā)送 Native 消息時吮螺,handler 對象的協(xié)議方法被調(diào)用,通過協(xié)議方法的相關(guān)參數(shù)傳值帕翻。
#pragma mark - WKScriptMessageHandler
  -  (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message

WKWebView的痛點

Cookie問題

這個坑自iOS 8之后一直被Apple公司做出各種調(diào)整甚至到了iOS 10和iOS 11版本在Cookie上依然做出了比較大的調(diào)整鸠补,在傳統(tǒng)的UIWebView中,Cookie是通過NSHTTPCookieStorage統(tǒng)一管理嘀掸,服務(wù)器返回時寫入紫岩,發(fā)起請求時服務(wù),Web和Native能共享Cookie睬塌。在WKWebView中泉蝌,Cookie的寫入不是實時的歇万,而且請求時也不會實時讀取Cookie,這導(dǎo)致了app會丟失cookie勋陪,無法做到session和Native同步贪磺。

跨域問題

跨域問題,HTTPS 對 HTTPS诅愚、HTTP 對 HTTP 跨域默認是能載入的寒锚,但如果是 HTTP 想載入 HTTPS 跨域鏈接,因為安全考慮违孝,WKWebView 會被攔截刹前,這問題在引入跨域 HTTPS 的頁面也做 HTTPS。

關(guān)于WKWebView在iOS11上的新特性

Cookie的管理

iOS11上雌桑,WKWebView 新增了 Cookie 管理 API WKHTTPCookieStore腮郊,通過該接口可以設(shè)置、刪除和查詢 WKWebView cookie筹燕,甚至可以監(jiān)聽 cookie store 的變化轧飞。(但是對于UIWebView和WKWebView混合使用的業(yè)務(wù),需要對WKHTTPCookieStore和NSHTTPCookieStorage之間做一些同步操作撒踪。)

加載本地資源

由于WKWebView的網(wǎng)絡(luò)請求是在非主進程中發(fā)起过咬,所以NSURLProtocol無法攔截請求,在iOS11中制妄,提供了專門的接口加載本地資源掸绞。

- (void)webView:(WKWebView *)webView startURLSchemeTask:(id)urlSchemeTask

但是,依然有坑耕捞,WKWebView不允許攔截 Scheme 為 “http”衔掸、“https”、“ftp”俺抽、“file” 敞映,我想這一目的是為了限制開發(fā)人員只能下載屬于自己的資源而做出的限制,也是出于一種安全的考慮磷斧。

Filter Unwanted

Filter unwanted contentWWDC 2015上振愿,WebKit 團隊介紹了 Safari 上新增的 Content Blocker 特性,可以實現(xiàn)阻止頁面內(nèi)容加載或隱藏頁面內(nèi)容等功能弛饭。在WWDC 2017上冕末,WebKit 團隊將這一特性移植到了 WKWebView。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末侣颂,一起剝皮案震驚了整個濱河市档桃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌憔晒,老刑警劉巖藻肄,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件销凑,死亡現(xiàn)場離奇詭異,居然都是意外死亡仅炊,警方通過查閱死者的電腦和手機斗幼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抚垄,“玉大人蜕窿,你說我怎么就攤上這事〈裟伲” “怎么了桐经?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長浙滤。 經(jīng)常有香客問我阴挣,道長,這世上最難降的妖魔是什么纺腊? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任畔咧,我火速辦了婚禮,結(jié)果婚禮上揖膜,老公的妹妹穿的比我還像新娘誓沸。我一直安慰自己,他們只是感情好壹粟,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布拜隧。 她就那樣靜靜地躺著,像睡著了一般趁仙。 火紅的嫁衣襯著肌膚如雪洪添。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天雀费,我揣著相機與錄音干奢,去河邊找鬼。 笑死坐儿,一個胖子當(dāng)著我的面吹牛律胀,可吹牛的內(nèi)容都是我干的宋光。 我是一名探鬼主播貌矿,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼罪佳!你這毒婦竟也來了逛漫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤赘艳,失蹤者是張志新(化名)和其女友劉穎酌毡,沒想到半個月后克握,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡枷踏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年菩暗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旭蠕。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡停团,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掏熬,到底是詐尸還是另有隱情佑稠,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布旗芬,位于F島的核電站舌胶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏疮丛。R本人自食惡果不足惜幔嫂,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望誊薄。 院中可真熱鬧婉烟,春花似錦、人聲如沸暇屋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咐刨。三九已至昙衅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間定鸟,已是汗流浹背而涉。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留联予,地道東北人啼县。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像沸久,于是被迫代替她去往敵國和親季眷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,072評論 25 707
  • *此一朝血色山河 傾十年看盡沉舸 千古的江山畫卷 抹不掉歷史鐵戈 舊年里 赤金戎甲 轉(zhuǎn)如今 青衣謀劃 躲不過宿命深...
    拂塵為君_閱讀 607評論 10 9
  • 人情的牽絆卷胯,你道只是負擔(dān)子刮,卻不知它們也將孤獨填滿。 在這冷清而寂寞的深秋午后窑睁,我迫不及待的找尋著溫暖之物挺峡,柜子葵孤、抽...
    停停停云閱讀 277評論 0 0
  • 昨晚下了陣冬雨加雪,今早一早又飄落了些橱赠。恰好今日早晨要上第一節(jié)課尤仍,我如往常一樣開車出門。起初只是有霧狭姨,打開閃光照常...
    Daisy1982閱讀 219評論 1 1