WKWebView 在 iOS8 下的坑
WKWebView屬于WebKit,是 apple 在 iOS8 上給開發(fā)者提供的新的 web 內容展示控件。根據(jù)官方測試,其各項性能都比傳統(tǒng)的 UIWebView 強上數(shù)倍。但實際使用下來,其在 iOS8 上充其量算是個半成品,完全不具備替代 UIWebView 的實力。究其原因,有以下幾個方面...
背景描述
項目中需要展示包含大量數(shù)學公式的頁面,經(jīng)過調研,最后決定以 HTML 頁面的形式展示,數(shù)學公式的渲染交給 JS 庫 MathJax 來完成
-
具體方式為
本地事先寫好的 HTML 模版 + 從 server 端后去所需展示的內容 + 調用同樣在本地的 JavaScript 函數(shù)將數(shù)據(jù)填充置`<body>`內 + 調用從網(wǎng)絡獲取的 MathJax 函數(shù),進行渲染 除了JS部分比較費勁之外??,很快,一個基于WKWebView的數(shù)學展示控件基本成型,在 iOS9 中測試一切OK??,切換至 iOS8 測試,噩夢開始了????
無法加載本地資源
- 假設現(xiàn)在有本地 HTML 文件:localHTML.html,其中引用了一個本地 JS 文件:localJS.js;一個本地 css 文件:localCSS.css,你會發(fā)現(xiàn)在 iOS9 下加載一切正常的文件們在 iOS8 下統(tǒng)統(tǒng)找不到,具體表現(xiàn)為打開 safari 進行調試(不知道如何利用 safari 調試 iOS 上 web 內容的看這里),本地文件全部為紅色,表示無法加載
- 最初,我以為是目錄結構的問題,各種嘗試,但一直無果。被這個問題卡了2天加一個周末后,我看到了爆棧上的一個問答,我放棄了??,決定將除了 HTML 之外的所有文件都存放在 server,以為這樣就萬事大吉了,但沒想到自己還是 too young too naive??
在 HTML 中設置 meta charset="utf-8" 無效
-
我們都知道,如果在 HTML 的 <head> 標簽中設置
utf-8,表示這個文件及其所引用的所有文件都以utf-8的編碼形式打開,例如:<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>This is a text</title> </head> <body> ... </body> </html> 然后,當我把所有本地文件都移動至 server,高高興興??的開始測試的時候,發(fā)現(xiàn)無法渲染數(shù)學公式,打開 safari 調試,發(fā)現(xiàn)所有的 js / css,都變成了亂碼,可是iOS9 上還是正常的?。。。。。?/strong>,簡直是晴天霹靂,我頓時又懵逼了??
-
在自學了半天 css 之后,我決定每次在 HTML 中引用其他文件時,都在后面加上
utf-8,例如:<link type="text/css" rel="stylesheet" href="lounge.css" charset="utf-8"> 果然本我修復了大半,注意這里是大半,不是完全,因為我又發(fā)現(xiàn)這些被引用的文件在引用其他文件時也會是亂碼,例如 MathJax 引用自己的其他文件時,我再次進入懵逼狀態(tài)????
無法使用 NSURLProtocol 攔截請求
- 基于上面的兩點,我徹底放棄了 WKWebView,我很不服氣,自己先是被 JS 玩得不要不要的, 然后又被 apple 玩的不要不要的,但是又有什么辦法呢,生活還要繼續(xù)不是嗎???
- 至于無法使用 NSURLProtocol 攔截請求,我還沒有親自嘗試,據(jù)說是因為
WKWebView是在其他進程去做請求,而非當前進程(參考) - 這點相當糟糕,要知道 NSURLProtocol 絕對是個大殺器
樣式同 UIWebView 有較大差距
- 同一個 css,在 UIWebView 和 WKWebView 上形式有很大區(qū)別,而恰恰安卓的樣式同
前者基本一致,試想以下你需要為 android 和 iOS 寫兩個不同的 css 文件,蛋碎?? - 而且,根據(jù)我的實驗,有時對 css 的修改 WKWebView 還不買賬,具體原因不詳
總結
一句話總結:貌似 apple 是不會修復 WKWebView 在 iOS8 上的這些 bug 了,所以我們就等吧,等到 iOS8 用戶幾乎沒有,app 最低支持 iOS9 的時候,再去用它