WKWebView 在 iOS8 下的坑
WKWebView屬于WebKit捌年,是 apple 在 iOS8 上給開(kāi)發(fā)者提供的新的 web 內(nèi)容展示控件飒泻。根據(jù)官方測(cè)試灰伟,其各項(xiàng)性能都比傳統(tǒng)的 UIWebView 強(qiáng)上數(shù)倍恶守。但實(shí)際使用下來(lái)磁奖,其在 iOS8 上充其量算是個(gè)半成品北启,完全不具備替代 UIWebView 的實(shí)力卜朗。究其原因拔第,有以下幾個(gè)方面...
背景描述
項(xiàng)目中需要展示包含大量數(shù)學(xué)公式的頁(yè)面,經(jīng)過(guò)調(diào)研场钉,最后決定以 HTML 頁(yè)面的形式展示蚊俺,數(shù)學(xué)公式的渲染交給 JS 庫(kù) MathJax 來(lái)完成
-
具體方式為
本地事先寫(xiě)好的 HTML 模版 + 從 server 端后去所需展示的內(nèi)容 + 調(diào)用同樣在本地的 JavaScript 函數(shù)將數(shù)據(jù)填充置`<body>`內(nèi) + 調(diào)用從網(wǎng)絡(luò)獲取的 MathJax 函數(shù),進(jìn)行渲染
除了JS部分比較費(fèi)勁之外??逛万,很快泳猬,一個(gè)基于WKWebView的數(shù)學(xué)展示控件基本成型,在 iOS9 中測(cè)試一切OK??宇植,切換至 iOS8 測(cè)試得封,噩夢(mèng)開(kāi)始了????
無(wú)法加載本地資源
- 假設(shè)現(xiàn)在有本地 HTML 文件:localHTML.html,其中引用了一個(gè)本地 JS 文件:localJS.js指郁;一個(gè)本地 css 文件:localCSS.css忙上,你會(huì)發(fā)現(xiàn)在 iOS9 下加載一切正常的文件們?cè)?iOS8 下統(tǒng)統(tǒng)找不到,具體表現(xiàn)為打開(kāi) safari 進(jìn)行調(diào)試(不知道如何利用 safari 調(diào)試 iOS 上 web 內(nèi)容的看這里)闲坎,本地文件全部為紅色疫粥,表示無(wú)法加載
- 最初,我以為是目錄結(jié)構(gòu)的問(wèn)題腰懂,各種嘗試梗逮,但一直無(wú)果。被這個(gè)問(wèn)題卡了2天加一個(gè)周末后绣溜,我看到了爆棧上的一個(gè)問(wèn)答慷彤,我放棄了??,決定將除了 HTML 之外的所有文件都存放在 server怖喻,以為這樣就萬(wàn)事大吉了底哗,但沒(méi)想到自己還是 too young too naive??
在 HTML 中設(shè)置 meta charset="utf-8" 無(wú)效
-
我們都知道,如果在 HTML 的 <head> 標(biāo)簽中設(shè)置
utf-8
锚沸,表示這個(gè)文件及其所引用的所有文件都以utf-8
的編碼形式打開(kāi)艘虎,例如:<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>This is a text</title> </head> <body> ... </body> </html>
然后,當(dāng)我把所有本地文件都移動(dòng)至 server咒吐,高高興興??的開(kāi)始測(cè)試的時(shí)候野建,發(fā)現(xiàn)無(wú)法渲染數(shù)學(xué)公式,打開(kāi) safari 調(diào)試恬叹,發(fā)現(xiàn)所有的 js / css候生,都變成了亂碼,可是iOS9 上還是正常的U乐纭Nㄑ肌!9枞贰D扛取明肮!,簡(jiǎn)直是晴天霹靂缭付,我頓時(shí)又懵逼了??
-
在自學(xué)了半天 css 之后柿估,我決定每次在 HTML 中引用其他文件時(shí),都在后面加上
utf-8
陷猫,例如:<link type="text/css" rel="stylesheet" href="lounge.css" charset="utf-8">
果然本我修復(fù)了大半秫舌,注意這里是大半,不是完全绣檬,因?yàn)槲矣职l(fā)現(xiàn)這些被引用的文件在引用其他文件時(shí)也會(huì)是亂碼足陨,例如 MathJax 引用自己的其他文件時(shí),我再次進(jìn)入懵逼狀態(tài)????
無(wú)法使用 NSURLProtocol 攔截請(qǐng)求
- 基于上面的兩點(diǎn)娇未,我徹底放棄了 WKWebView墨缘,我很不服氣,自己先是被 JS 玩得不要不要的零抬, 然后又被 apple 玩的不要不要的飒房,但是又有什么辦法呢,生活還要繼續(xù)不是嗎媚值???
- 至于無(wú)法使用 NSURLProtocol 攔截請(qǐng)求,我還沒(méi)有親自嘗試护糖,據(jù)說(shuō)是因?yàn)?code>WKWebView是在其他
進(jìn)程
去做請(qǐng)求褥芒,而非當(dāng)前進(jìn)程(參考) - 這點(diǎn)相當(dāng)糟糕,要知道 NSURLProtocol 絕對(duì)是個(gè)大殺器
樣式同 UIWebView 有較大差距
- 同一個(gè) css嫡良,在 UIWebView 和 WKWebView 上形式有很大區(qū)別锰扶,而恰恰安卓的樣式同
前者
基本一致,試想以下你需要為 android 和 iOS 寫(xiě)兩個(gè)不同的 css 文件寝受,蛋碎?? - 而且坷牛,根據(jù)我的實(shí)驗(yàn),有時(shí)對(duì) css 的修改 WKWebView 還不買(mǎi)賬很澄,具體原因不詳
總結(jié)
一句話總結(jié):貌似 apple 是不會(huì)修復(fù) WKWebView 在 iOS8 上的這些 bug 了京闰,所以我們就等吧,等到 iOS8 用戶(hù)幾乎沒(méi)有甩苛,app 最低支持 iOS9 的時(shí)候蹂楣,再去用它