從 UIWebView 到 WKWebView

發表於2016-04-05

引言

①本文章適合有 UIWebView 基礎的人看,如果實在沒用過的話,至少你要知道 UIWebView 是個什麼東西。

② UIWebView 和 WKWebView 的區別
WKWebView 更快(佔用記憶體可能只有 UIWebView 的1/3~1/4),沒有快取,更為細緻地拆分了 UIWebViewDelegate 中的方法。
想要了解更多關於 WKWebView 的特性的,可以自行 Google,這裡你可以簡單地把它當做是輕量級的 UIWebView。

③為什麼現在是時候從 UIWebView 遷移到 WKWebView 了:
截止到我寫這篇文章的時候,據 mixpanel 的資料,iOS 9 佔有率已達 58.55%,iOS 8 佔有率達到了 34.78%,iOS 7 及更早版本是 6.66%,而那 6.66% 應該大部分都是對手機使用極度不頻繁的人。所以從現在開始,再開發 App 只相容 iOS 8 和 iOS 9 兩個版本就可以了(如果你的產品對覆蓋率要求不是很苛刻的話)。WKWebView 是 iOS 8 之後才有的 WebKit 中的內容,所以之前我們要同時相容 iOS 7 和 iOS 8 的時候,可以推辭說 UIWebView 和 WKWebView 一起做太麻煩了,現在可沒有理由拒絕新東西了。

正文

常用代理方法

在 WKWebView 中,UIWebViewDelegate 與 UIWebView 被重構成了14類與3個協議,下面給出一些在 UIWebView 中常用的方法的 WKWebView 版本。

以上方法分別存在於 UIWebViewDelegate 和 WKNavigationDelegate 中。

如果你之前只是用到了以上列出的 UIWebViewDelegate 中的幾個方法,那麼只是簡單地換一個方法名,讓你的 ViewController 繼承 WKNavigationDelegate ,繼續用就可以了。想要更多內容可以自己用 cmd鍵+滑鼠左擊『WKNavigationDelegate』通過 Xcode 檢視。
要注意的是 webview.delegate = self 需要改寫為 webview.navigationDelegate = self

JS互動

在 UIWebView 中,一句簡單的webView.stringByEvaluatingJavaScriptFromString() 就可以用 JS 指令碼操縱 WebView,在 WKWebView 中,我們可能需要用到 WKScriptMessageHandler 這個協議中的 func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage) 方法。

下面的示例程式碼用於從 WKWebView 中獲取網頁中的文字。

可能你也注意到了,把 JS 指令碼注入到 WebView 的途徑是初始化一個 WebView,所以你需要在 WebView 初始化之前寫好自己的指令碼。當然如果你不需要 JS 互動,直接用一個 frame 來初始化 WebView,去掉 configuration 引數就好了。

然而,我們如何拿到從 WKWebView 中抓取到的文字呢(通過 document.body.innerText 這一句)?
如上面所說,讓你的 ViewController 在繼承了 WKNavigationDelegate 之後再繼承一下 WKScriptMessageHandler 。然後實現 WKScriptMessageHandler 中唯一的一個方法:

乍一看這裡可能會有疑惑:我們給 WKWebView 繫結了 WKNavigationDelegate,但是 WKScriptMessageHandler 並沒有提供代理方法啊。其實與此相對應的過程出現在上一段程式碼中的第5行:config.userContentController.addScriptMessageHandler 這一句。

後記

我是一名獨立的 iOS 開發者,也在學習當中,希望在這裡記錄自己學到的一些東西。
如果想和我聯絡,或者單純加個微信的話,下面是我的聯絡方式:

姓名:徐開源
郵箱:wm-ing@qq.com
微訊號:balabala-ba

歡迎交流 :)
點選檢視我釋出在 AppStore 的作品

相關文章