IOS 進階之 WKWebView

發表於2016-10-12
112368050-ef83d291bce395ff
標題圖片

前言


Xcode8釋出以後,編譯器開始不支援IOS7,所以很多應用在適配IOS10之後都不在適配IOS7了,其中包括了很多大公司,網易新聞,滴滴出行等。因此,我們公司的應用也打算淘汰IOS7。

支援到IOS8,第一個要改的自然是用WKWebView替換原來的UIWebView。WKWebView有很多明顯優勢:

  • 更多的支援HTML5的特性
  • 官方宣稱的高達60fps的滾動重新整理率以及內建手勢
  • 將UIWebViewDelegate與UIWebView拆分成了14類與3個協議,以前很多不方便實現的功能得以實現。文件
  • Safari相同的JavaScript引擎
  • 佔用更少的記憶體

UIWebView

122368050-1d0493d228b5bac8

WKWebView

132368050-24e41f21673f40e5

因此,使用WkWebview替換UIWebView還是很有必要的。

基本使用方法


WKWebView有兩個delegate,WKUIDelegateWKNavigationDelegate。WKNavigationDelegate主要處理一些跳轉、載入處理操作,WKUIDelegate主要處理JS指令碼,確認框,警告框等。因此WKNavigationDelegate更加常用。

比較常用的方法:

OC與JS互動


WKWebview提供了API實現js互動 不需要藉助JavaScriptCore或者webJavaScriptBridge。使用WKUserContentController實現js native互動。簡單的說就是先註冊約定好的方法,然後再呼叫。

JS呼叫OC方法

oc程式碼(有誤,記憶體不釋放):

上面的OC程式碼如果認證測試一下就會發現dealloc並不會執行,這樣肯定是不行的,會造成記憶體洩漏。原因是[userContentController addScriptMessageHandler:self name:@"sayhello"];這句程式碼造成無法釋放記憶體。(ps:試了下用weak指標還是不能釋放,不知道是什麼原因。)因此還需要進一步改進,正確的寫法是用一個新的controller來處理,新的controller再繞用delegate繞回來。

oc程式碼(正確寫法):

WKDelegateController程式碼:

.m程式碼:

h5程式碼:

列印出的log:

注意點

  • addScriptMessageHandler要和removeScriptMessageHandlerForName配套出現,否則會造成記憶體洩漏。
  • h5只能傳一個引數,如果需要多個引數就需要用字典或者json組裝。

oc呼叫JS方法

程式碼如下:

h5程式碼同上。

WebViewJavascriptBridge


一般來說,一個好的UI總有一個大神會開發出一個好的第三方封裝框架。WebViewJavascriptBridge的作者也做了一套支援WKWebView與JS互動的第三方框架:WKWebViewJavascriptBridge。

主要方法如下:

基本的實現方法和上面寫的差不多,就是封裝了一下,有興趣的童鞋可以自己pod下來使用。


我是翻滾的牛寶寶,歡迎大家評論交流~

相關文章