WKWebView

UIWebView 之痛

開發(fā)App的過程中勉盅,常常會遇到在App內(nèi)部加載網(wǎng)頁拦耐,通常用UIWebView加載龙考。而這個自iOS2.0開始使用的Web容器一直是開發(fā)的心蚕渌丁:加載速度慢筋现,占用內(nèi)存多唐础,優(yōu)化困難箱歧。如果加載網(wǎng)頁多,還可能因為過量占用內(nèi)存而給系統(tǒng)kill掉一膨。各種優(yōu)化的方法效果也不那么明顯呀邢,常見的優(yōu)化緩存方式:

1、盡量使用 GET 請求汞幢,iOS 系統(tǒng) SDK 會自動幫你做緩存驼鹅。你需要的僅僅是設(shè)置下內(nèi)存緩存大小、磁盤緩存大小森篷、以及緩存路徑输钩。只要設(shè)置了這兩行代碼,基本就可滿足80%的緩存需求仲智。

設(shè)置緩存.jpg

2买乃、Web資源離線加載,熱更新資源钓辆,完成另外20%的緩存需求(Hybrid框架的Web部分)剪验。

可是無數(shù)開發(fā)者嘗試自己做一個“簡陋而脆弱的”系統(tǒng)來實現(xiàn)網(wǎng)絡(luò)緩存的功能,效果往往是事倍功半 前联。

初識 WKWebView

UIWebView從 iOS2 就有功戚,iOS8 以后,蘋果推出了新框架 WebKit似嗤,提供了替換 UIWebView 的組件 WKWebView啸臀。各種 UIWebView 的性能問題沒有了,速度更快了烁落,占用內(nèi)存少了乘粒,體驗更好了,下面列舉一些其它的優(yōu)勢:

1伤塌、在性能灯萍、穩(wěn)定性、功能方面有很大提升(加載速度每聪,內(nèi)存的提升誰用誰知道)

2旦棉、更多的支持 HTML5 的特性

3、官方宣稱的高達(dá)60fps的滾動刷新率以及內(nèi)置手勢

4药薯、Safari 相同的 JavaScript 引擎

5他爸、將 UIWebViewDelegate 與 UIWebView 拆分成了14類與3個協(xié)議,包含該更細(xì)節(jié)功能的實現(xiàn)果善。

相比之下诊笤,WKWebView 復(fù)雜得多,一些常用API如下:

容器相關(guān)

WKWebView.jpg

JavaScript 配置相關(guān)

JavaScript API.jpg

存儲相關(guān)(只支持iOS9以上)

存儲類型.jpg

存儲 API.jpg

頁面加載相關(guān)

WKWebView loadRequest.jpg

代理相關(guān)

WKNavigationDelegate.jpg

看完API以后巾陕,要掌握 WKWebView 并不難讨跟,難的是如何處理iOS版本碎片化兼容問題纪他。

性能對比測試

都說提高多么多么大的性能,實測告訴你 WKWebView 的性能有多好晾匠,下面用實際項目做個對比測試:

UIWebView 首次加載 www.58.com 首頁茶袒,耗時 0.0154584ms,內(nèi)存消耗 24.1 MB

UIWebView耗時.jpg

UIWebView內(nèi)存消耗.jpg

WKWebView 首次加載 www.58.com 首頁凉馆,耗時 0.013875ms薪寓,內(nèi)存消耗僅 6.4 MB

WKWebView耗時.jpg

WKWebView內(nèi)存消耗.jpg

結(jié)論:加載耗時差別不大,WKWebView 的內(nèi)存優(yōu)化減少了幾乎4倍澜共,更重要的是向叉,無論 WKWebView 跳轉(zhuǎn)多少 Web 頁面都沒有內(nèi)存泄漏了。WKWebView 使用和 Safari 相同的 Nitro JS 引擎性能嗦董,對HTML5性能也提升了4倍母谎。

WKWebView 之坑

新技術(shù)的出現(xiàn)必然會或多或少的瑕疵,WKWebView 也不例外京革。

1奇唤、關(guān)于緩存

在 WKWebsiteDataStore 出現(xiàn)之前(iOS 9 中),WKWebView 是沒有緩存匹摇,也無從清理咬扇。WKWebView 是基于 WebKit 框架的,它會忽視先前使用的網(wǎng)絡(luò)存儲 NSURLCache, NSHTTPCookieStorage, NSCredentialStorage等廊勃,它也有自己的存儲空間用來存儲cookie和cache冗栗,其他的網(wǎng)絡(luò)類如NSURLConnection 是無法訪問到的。 同時WKWebView發(fā)起的資源請求也是不經(jīng)過NSURLProtocol的供搀,導(dǎo)致無法攔截或自定義新請求。

體驗過 WKWebView 的一定會遇到修改了H5頁面钠至,APP打開時卻沒有即時更新的問題(實在是緩存得太好了)葛虐,iOS 8的時候只能增加時間戳的方式解決這個問題(調(diào)試下使用,生產(chǎn)環(huán)境就只能要求前端修改Cache-Controll了)棉钧,如下:

時間戳更新.jpg

iOS 9以后終于可以使用 WKWebsiteDataStore 來清理緩存屿脐。后來Google一下,又發(fā)現(xiàn)iOS 8可以通過清理 Library 目錄下的 Cookies 目錄來清除緩存宪卿,于是

清除WKWebView緩存.jpg

緩存清理的坑趟過了的诵,喜大普奔。

2佑钾、關(guān)于 Cookie

在使用 UIWebVIew 的時候我們并不關(guān)注 Cookie西疤,因為在調(diào)用登錄接口的時候無論是AFNetworking,還是其他休溶,登錄成功之后都會自動保存在

[NSHTTPCookieStorage sharedHTTPCookieStorage].cookies 中代赁,以后再使用也會自動去獲热潘(這里有個 UIWebView 的坑:訪問的鏈接越多,如不處理Cookie芭碍,它會加載越來越多的無效 Cookie 導(dǎo)致內(nèi)容急劇增大)徒役。但 WKWebView 的存儲體系與 UIWebVIew 完全不一樣,只能手動給它添加 Cookie窖壕,如下:

WKWebView設(shè)置cookie.jpg

但即便如此忧勿,Cookie 還是會偶現(xiàn)丟失的問題,最終只好采用每次 Web 開始加載之時判斷 Cookie 是否存在瞻讽,否則手動添加重新加載鸳吸,如下:

WKWebView設(shè)置cookie.jpg

Cookie 獲取的坑趟過了,再次喜大普奔卸夕。

3层释、關(guān)于跨域

WebKit框架對跨域進(jìn)行了安全性檢查限制,不允許跨域快集,比如從一個 HTTP 頁對 HTTPS

發(fā)起請求是無效的(有一個界面要跳到支付寶頁面去支付贡羔,死活沒反應(yīng))。而系統(tǒng)的 Safari 个初,iOS 10出現(xiàn)的

SFSafariViewController 都是支持跨域的乖寒,因此解決辦法如下:

跨域跳轉(zhuǎn).jpg

對于自身域名,還是建議全站 HTTPS 化吧(大勢所趨)院溺。

4楣嘁、關(guān)于 JavaScript 交互

UIWebView 使用的 JavaScriptCore 框架,交互時為 JavaScript 運(yùn)行的上下文環(huán)境 JSContext

注入對象 Bridge珍逸;WKWebView 使用的 WebKit 框架逐虚,交互時為 webkit.messageHandlers 注入對象,如下:

JavaScript注入.jpg

前端H5需要做判斷兩種不同注入方式帶來的不同調(diào)用方式:

js調(diào)用.jpg

5谆膳、關(guān)于 NSURLProtocol 攔截

WKWebView 基于 WebKit 框架嚼鹉,與 UIWebView 機(jī)制不同:加載過程中所有的請求都不經(jīng)過

NSURLProtocol间驮,換句話說就是 WKWebView 無法攔截響應(yīng)數(shù)據(jù) 鑒于之前大部分 Hybrid

框架的離線預(yù)加載機(jī)制都依賴于攔截功能不从,這意味著廢掉很多程序猿們辛辛苦苦設(shè)計實現(xiàn)的 Hybrid 框架(內(nèi)功盡失藻丢,感覺身體被掏空),再加上

WKWebView 自身的坑不少杨帽,因此很多團(tuán)隊都不會輕易替換掉 UIWebView漓穿。擁抱變化吧,WKWebView 遲早會取代

UIWebView 成為最佳 Web 容器(iOS 9帶來的 SFSafariViewController

更是武功全廢注盈,啥都干不了晃危,只能干瞪眼)。

那么問題來了老客,如何設(shè)計新的 Hybrid 框架呢山害?此處出門左轉(zhuǎn)纠俭,點(diǎn)擊文章開頭進(jìn)入公眾號歷史文章,查看《通用Web&Native交互協(xié)議設(shè)計方案》浪慌。

6冤荆、關(guān)于 POST 請求

簡書http://www.reibang.com/p/403853b63537中有關(guān)于這個坑的具體描述,筆者這里就不再做研究权纤,這里只說明怎么趟過的坑:使用通用的 Web&Native 交互協(xié)議钓简,為 Web 提供 Native POST 請求的接口+回調(diào) CallBack 即可,參見關(guān)于 JavaScript 交互汹想。

7外邓、關(guān)于本地 HTML 加載

當(dāng)使用 loadRequest 來讀取本地 Documents 目錄的 HTML 文件時,WKWebView 是無法讀取成功的古掏,只能通iOS 9的新接口加載

load loacl html.jpg

但是在iOS9以下的版本是沒提供這個便利的方法的损话,解決辦法:先將本地 HTML 文件的數(shù)據(jù) copy 到 tmp 目錄中,然后再使用 loadRequest 來加載槽唾。但是如果在 HTML 中加入了其他資源文件丧枪,例如 js,css庞萍,image 等也必須一同 copy 到 tmp 中拧烦,這個是非常蛋疼的事情了。然而還有更蛋疼的事:iOS 8下還必須 copy 到 tmp 的 www 目錄下 WKWebView 才能讀榷奂啤(Word天恋博,心中千萬只草泥馬狂奔而過)。參見http://stackoverflow.com/questions/24882834/wkwebview-not-loading-local-files-under-ios-8

8私恬、關(guān)于捏合手勢

很多人都喜歡使用 UIWebView 的捏合手勢來進(jìn)行放大和縮小债沮,觀看 Web 內(nèi)容,但 WKWebView 在手機(jī)上不支持本鸣,卻支持其他iOS設(shè)備(草泥馬再次狂奔而過)疫衩。

不支持捏合手勢.png

寫在最后

當(dāng)時選擇 WKWebView 就是為了提高性能,但是沒有想到遇到這么多坑永高,真是我待 WKWebView 如初戀,WKWebView 虐我千百遍提针,興許還有許多未知的坑命爬,歡迎大家留言補(bǔ)充。謝謝支持辐脖!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末饲宛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嗜价,更是在濱河造成了極大的恐慌艇抠,老刑警劉巖幕庐,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異家淤,居然都是意外死亡异剥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門絮重,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冤寿,“玉大人,你說我怎么就攤上這事青伤《搅” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵狠角,是天一觀的道長号杠。 經(jīng)常有香客問我,道長丰歌,這世上最難降的妖魔是什么姨蟋? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮动遭,結(jié)果婚禮上芬探,老公的妹妹穿的比我還像新娘。我一直安慰自己厘惦,他們只是感情好偷仿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宵蕉,像睡著了一般酝静。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上羡玛,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天别智,我揣著相機(jī)與錄音,去河邊找鬼稼稿。 笑死薄榛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的让歼。 我是一名探鬼主播敞恋,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谋右!你這毒婦竟也來了硬猫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎啸蜜,沒想到半個月后坑雅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衬横,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年裹粤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冕香。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛹尝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悉尾,到底是詐尸還是另有隱情突那,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布构眯,位于F島的核電站愕难,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏惫霸。R本人自食惡果不足惜猫缭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望壹店。 院中可真熱鬧猜丹,春花似錦、人聲如沸硅卢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽将塑。三九已至脉顿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間点寥,已是汗流浹背艾疟。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留敢辩,地道東北人蔽莱。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像戚长,于是被迫代替她去往敵國和親盗冷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

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

  • 轉(zhuǎn)載自: http://www.reibang.com/p/90a90bd13aac WKWebView從入門到趟...
    F麥子閱讀 652評論 0 3
  • 前言 關(guān)于UIWebView的介紹历葛,相信看過上文的小伙伴們正塌,已經(jīng)大概清楚了吧,如果有問題恤溶,歡迎提問乓诽。 本文是本系列...
    CoderLF閱讀 8,944評論 2 12
  • 通過學(xué)習(xí),你將會學(xué)習(xí)以下幾個方面的內(nèi)容: **什么是WKWebView以及它和UIWebView的區(qū)別是什么 **...
    SOI閱讀 11,599評論 18 42
  • UIWebView 之痛 開發(fā)App的過程中咒程,常常會遇到在App內(nèi)部加載網(wǎng)頁鸠天,通常用UIWebView加載。而這個...
    zyl04401閱讀 16,016評論 46 157
  • 前言 關(guān)于UIWebView的介紹剥纷,相信看過上文的小伙伴們,已經(jīng)大概清楚了吧呢铆,如果有問題晦鞋,歡迎提問。 本文是本系列...
    Dark_Angel閱讀 28,789評論 67 291