iOS H5容器的一些探究(一):UIWebView和WKWebView的比較和選擇

發表於2016-09-07

一、Native開發中為什麼需要H5容器

Native開發原生應用是手機作業系統廠商(目前主要是蘋果的iOS和google的Android)對外界提供的標準化的開發模式,他們對於native開發提供了一套標準化實現和優化方案。但是他們存在一些硬傷,比如App的發版週期偏長、有時無法跟上產品的更新節奏;靈活性差,如果有較大的方案變更,需要發版才能解決;如果存在bug,在當前版本修復的難度比較大(iOS的JSPatch方案和Android的Dex修復方案);需要根據不同的平臺寫不同的程式碼,iOS主要為object_c和swift,android為Java。

而作為H5為主要開發模式的Web App的靈活性就比較強,他利用作業系統中的h5容器作為一個承載,對外提供一個url連結,而該url連結對應的內容可以實時在服務端進行修改,靈活行很強,避免了Native發版週期帶來的時間成本。但是h5雖然靈活,但是他也有自己的硬傷。每次都需要下載完整的UI資料(html,css,js),弱網使用者體驗較差,流量消耗較大;無法呼叫系統檔案系統,硬體資源等等;

Native App和Web App都有他們的優勢和劣勢。我們也不能一棍子拍死說誰好誰劣。通常的經驗是:對於一些比較穩當的業務,對使用者體驗要求較高的,我們可以選擇Native開發。而對於一些業務變更比較快、處在不斷試水的過程,而且不涉及呼叫檔案系統和硬體呼叫的業務我們可以選擇h5開發。所以說,在一款app中我們需要同時支援Native程式碼和h5程式碼。這也是我們標題所說的Native開發中需要H5容器的必要性。

iOS存在的h5容器主要包括UIWebView和WKWebView,下面我們就分別來說說他們的用法和優劣。

二、UIWebView的基本用法

2.1、載入網頁

2.2、UIWebViewDelegate幾個常用的代理方法

2.3、Native呼叫JS中的方法

比如我們在載入的HTML檔案中有如下js程式碼:

我們可以呼叫- (nullable NSString )stringByEvaluatingJavaScriptFromString:(NSString )script;函式進行js呼叫。

js程式碼不一定要在js檔案中預留,也可以在程式碼中通過字串的形式進行呼叫,比如下面:

2.4、JS中呼叫Naitve的方法

具體讓js通知native進行方法呼叫,我們可以讓js產生一個特殊的請求。可以讓Native程式碼可以攔截到,而且不然使用者察覺。業界一般的實現方案是在網頁中載入一個隱藏的iframe來實現該功能。通過將iframe的src指定為一個特殊的URL,實現在- (BOOL)webView:(UIWebView )webView shouldStartLoadWithRequest:(NSURLRequest )request navigationType:(UIWebViewNavigationType)navigationType;方案中進行攔截處理。對應的js呼叫程式碼如下:

比如我們在js程式碼中,呼叫一下兩個js方法:

當你觸發以上方法的時候,就會進入webview的代理方法中進行攔截。

這樣我們就可以讓js進行native的呼叫。

三、WKWebView的基本用法

3.1、載入網頁

3.2、幾個常用的代理方法

顯然WKWebView的代理方法提供了比UIWebView顆粒度更細的方法。讓開發者可以進行更加細緻的配置和處理。

3.3 、Native呼叫JS中的方法

WKWebView提供的呼叫js程式碼的函式是:

比如我們在載入的HTML檔案中有如下js程式碼:

我們可以呼叫如下程式碼進行js的呼叫:

同UIWebView一樣,我們也可以通過字串的形式進行js呼叫。

3.4、JS中呼叫Naitve的方法

除了和UIWebView載入一個隱藏的ifame之外,WKWebView自身還提供了一套js呼叫native的規範。

我們可以在初始化WKWebView的時候,給他設定一個config引數。

我們在js可以通過NativeMethod這個Handler讓js程式碼呼叫native。

比如在js程式碼中,我新增了一個方法

觸發以上方法的時候,會在native以下方法中進行攔截處理。

四、UIWebView和WKWebView的比較和選擇

WKWebView是蘋果在WWDC2014釋出會中釋出IOS8的時候公佈WebKit時候使用的新型的H5容器。它與UIWebView相比較,擁有更快的載入速度和效能,更低的記憶體佔用。將UIWebViewDelegate和UIWebView重構成了14個類,3個協議,可以讓開發者進行更加細緻的配置。

但是他有一個最致命的缺陷,就是WKWebView的請求不能被NSURLProtocol截獲。而我們團隊開發的app中對於H5容器最佳的優化點主要就在於使用NSURLProtocol技術對於H5進行離線包的處理和H5的圖片和Native的圖片公用一套快取的技術。因為該問題的存在,目前我們團隊還沒有使用WKWebView代替UIWebVIew。

五、聯絡方式

新浪微博
github
簡書首頁

歡迎加好友、一起交流。

相關文章