Flutter 與 iOS 原生 webView 對比

本文對比的是 UIWebView、WKWebView鸥印、flutter_webview_plugin(在iOS中使用的是WKWebView)的加載速度看尼,內存使用情況。

測試手機:iPhoneX

系統(tǒng):iOS12.0

  • 打開網頁速度對比

測試網頁打開的速度弓候,只需要獲取 WebView 在開始加載網頁和網頁加載完成時的時間戳郎哭,時間戳的差即為打開網頁的時間

  • WKWebView
extension WKWebViewVC: WKNavigationDelegate {
    
    public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        decisionHandler(.allow)
    }
    
    public func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
        startTime = Int(Date().timeIntervalSince1970 * 1000)
    }
    
    public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        let finishTime: Int = Int(Date().timeIntervalSince1970 * 1000)
        print("WKWebView \(finishTime - startTime)")
    }
}
  • UIWebView
extension WebViewVC: UIWebViewDelegate {
    
    public func webViewDidStartLoad(_ webView: UIWebView) {
        startTime = Int(Date().timeIntervalSince1970 * 1000)
    }
    
    public func webViewDidFinishLoad(_ webView: UIWebView) {
        let finishTime: Int = Int(Date().timeIntervalSince1970 * 1000)
        print("UIWebView \(finishTime - startTime)")
    }
}
  • flutter_webview_plugin
flutterWebViewPlugin.onStateChanged.listen((state) {
  if (state.type == WebViewState.finishLoad) {
    print('finishLoad:' + DateTime.now().millisecondsSinceEpoch.toString());
    setState(() {
      isLoad = false;
    });
  } else if (state.type == WebViewState.startLoad) {
    print('startLoad:' + DateTime.now().millisecondsSinceEpoch.toString());
    setState(() {
      isLoad = true;
    });
  }
});

為了使差異更明顯,我們選擇較為復雜的 新浪首頁 進行加載的對比菇存,為了減小網絡對加載速度的影響夸研,我們讓手機連接同一個網絡,分別進行 10 次測試然后取平均值依鸥,另外亥至,我們需要關閉 WebView 的緩存,防止緩存對加載速度產生影響

private func delegateCache() {
    let cache = URLCache.shared
    cache.removeAllCachedResponses()
    cache.diskCapacity = 0
    cache.memoryCapacity = 0
}
private func deleteWebCache() {
    let websiteDataTypes: Set<String> = WKWebsiteDataStore.allWebsiteDataTypes()
    let dateFrom = Date.init(timeIntervalSince1970: 0)
    WKWebsiteDataStore.default().removeData(ofTypes: websiteDataTypes, modifiedSince: dateFrom) {
    }
}
WebviewScaffold(
  key: _scaffoldKey,
  url: widget.url,
  clearCache: true,
  appCacheEnabled: false,
  .
  .
  .
);

下面使筆者進行 10 次測試所得到的數(shù)據(jù)

UIWebView WKWebView flutter_webview_plugin
0 4009 3384 3582
1 2856 3719 2869
2 2773 3258 3221
3 2776 3570 3178
4 2933 3386 3092
5 2679 3706 2956
6 2583 3707 3038
7 3145 2947 3015
8 3654 3038 3634
9 3258 3439 3132
avg 3066.6 3415.4 3171.7

結果讓我有點驚訝贱迟,一直以為 WKWebView 會是個王者姐扮。結果看,速度上 WKWebView 略慢一點衣吠,不過總體差異不大(該結果僅僅是測試新浪的結果溶握,僅供參考啦)

在這里,筆者又加了一個測試蒸播,嘗試記錄從 viewController 的 viewDidLoad 到 webview 的 didFinish 時間睡榆,測試了新浪的數(shù)據(jù)萍肆,如下:
UIWebViewA: 4970、3808胀屿、3815塘揣、4250、3556 avg(4079.8) (加載完所有頁面)
UIWebViewB: 4103宿崭、3124亲铡、3070、3256葡兑、2835 avg(3277.6)(加載sina完畢)
WKWebView: 3672奖蔓、3032、2892讹堤、2912吆鹤、2739 avg(3049.4)
flutter_webView: 4532、3901洲守、4310疑务、3496、3378 avg(3923.4)

其中可以看到梗醇,webView 有兩行知允,UIWebViewB 的數(shù)據(jù)就是加載 sina 主站的時間;UIWebViewA 的數(shù)據(jù)是因為在加載完 sina 主站之后叙谨,新浪又加載了一個https://r.dmp.sina.cn/cm/sinaads_ck_wap.html温鸽,所以導致總時間延長,不過即使按照 UIWebViewB 的數(shù)據(jù)來比較手负,也是 wkWebView 略勝一籌涤垫。
此處可以看出 flutter_webView 使用的是 wkwebView,所以它吃虧的主要原因是 flutter 包了一層虫溜。

結論:
速度(didStart -> didFinish) UIWebView > flutter_webview > WKWebView
速度(viewDidLoad -> didFinish)WKWebView > UIWebView > flutter_webview

  • 占用內存對比

這里查看內存使用的是 xcode 的 debug session 中的 memory。

首先看之前測試時股缸,連續(xù)打開十次新浪的內存情況


UIWebView.png

WKWebView.png

flutter_webView.png

接著我們在看一下打開淘寶首頁的內存情況

UIWebView.png

WKWebView.png

flutter_webView.png

從圖上可以看出衡楞,WKWebView 在內存方面有很大的優(yōu)勢啊,UIWebView 的內存是真的傷啊敦姻,然后 debug 看了一下 flutter_webView瘾境,他使用的就是原生的 webView 。
他相比較原生 WKWebView 的內存開銷稍大一點镰惦,從測試表現(xiàn)來看迷守,一般大個 30 MB 左右。

結論:內存 WKWebView > flutter_webview > UIWebView

  • html5 兼容性對比

可以在 html5test 中對瀏覽器的兼容性進行評分旺入,通過測試發(fā)現(xiàn)得分分別如下

UIWebView.png

WKWebView.png

flutter_webView.png

因為 flutter 里使用的就是 WK兑凿,所以和原生的 WKWebView 一樣都是 444 分凯力,比 UIWebView 的 437 略勝一籌

結論:兼容性 WKWebView = flutter_webview > UIWebView

  • 總結

UIWebView: 速度相比較 WKWebView 稍快一點,但是內存是一大硬傷礼华,所以只要條件允許咐鹤,就不推薦使用了
WKWebView: 速度略慢一點,不過差別不大圣絮,總體可以接受祈惶。是比UIWebView更好的選擇,推薦使用扮匠。
flutter_webView_plugin:在iOS中使用的就是原生的WKWebView捧请,所以總體和 native WKWebView 表現(xiàn)差不多。如果是混編項目中棒搜,因為它被包了一層疹蛉,所以頁面加載上存在一定的劣勢,所以混編項目中仍然推薦使用 WKWebView帮非。不過如果從多端考慮氧吐、以及項目可遷移等,那么使用也未嘗不可末盔,就是維護成本要增加一些筑舅,需要維護兩套 webView。這個就需要根據(jù)自己的情況自己取舍了陨舱。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末翠拣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子游盲,更是在濱河造成了極大的恐慌误墓,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件益缎,死亡現(xiàn)場離奇詭異谜慌,居然都是意外死亡,警方通過查閱死者的電腦和手機莺奔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門欣范,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人令哟,你說我怎么就攤上這事恼琼。” “怎么了屏富?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵晴竞,是天一觀的道長。 經常有香客問我狠半,道長噩死,這世上最難降的妖魔是什么颤难? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮甜滨,結果婚禮上乐严,老公的妹妹穿的比我還像新娘。我一直安慰自己衣摩,他們只是感情好昂验,可當我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著艾扮,像睡著了一般既琴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泡嘴,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天甫恩,我揣著相機與錄音,去河邊找鬼酌予。 笑死磺箕,一個胖子當著我的面吹牛,可吹牛的內容都是我干的抛虫。 我是一名探鬼主播松靡,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼建椰!你這毒婦竟也來了雕欺?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤棉姐,失蹤者是張志新(化名)和其女友劉穎屠列,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伞矩,經...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡笛洛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了乃坤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苛让。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖侥袜,靈堂內的尸體忽然破棺而出蝌诡,到底是詐尸還是另有隱情溉贿,我是刑警寧澤枫吧,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站宇色,受9級特大地震影響九杂,放射性物質發(fā)生泄漏颁湖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一例隆、第九天 我趴在偏房一處隱蔽的房頂上張望甥捺。 院中可真熱鬧,春花似錦镀层、人聲如沸镰禾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吴侦。三九已至,卻和暖如春坞古,著一層夾襖步出監(jiān)牢的瞬間备韧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工痪枫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留织堂,地道東北人。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓奶陈,卻偏偏與公主長得像易阳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子尿瞭,可洞房花燭夜當晚...
    茶點故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內容