WKWebView新特性及JS交互


引言

一直聽說WKWebViewUIWebView強大許多,可是一直沒有使用到,今天花了點時間看寫了個例子,對其API的使用有所了解,為了日后能少走彎路,也為了讓大家更容易學習上手,這里寫下這篇文章來記錄如何使用以及需要注意的地方。

溫馨提示:本人在學習使用過程中,確實有此體會,WKWebView的確比UIWebView強大很多,與JS交互的能力顯示增強,在加載速度上有所提升。

WKWebView新特性

  • 性能、穩定性、功能大幅度提升
  • 允許JavaScript的Nitro庫加載並使用(UIWebView中限制)
  • 支持了更多的HTML5特性
  • 高達60fps的滾動刷新率以及內置手勢
  • GPU硬件加速
  • KVO
  • 重構UIWebView成14類與3個協議,查看官方文檔

准備工作

首先,我們在使用的地方引入模塊:

在學習之前,建議大家先點擊WKWebView進去閱讀里面的相關API,讀完一遍,有個大概的印象,學習起來就很快了。

其初始化方法有:

加載HTML的方式與UIWebView的方式大致相同。其中,loadFileURL方法通常用於加載服務器的HTML頁面或者JS,而loadHTMLString方法通常用於加載本地HTML或者JS:

與之交互用到的三大代理:

  • WKNavigationDelegate,與頁面導航加載相關
  • WKUIDelegate,與JS交互時的ui展示相關,比較JS的alert、confirm、prompt
  • WKScriptMessageHandler,與js交互相關,通常是ios端注入名稱,js端通過window.webkit.messageHandlers.{NAME}.postMessage()來發消息到ios端

創建WKWebView

首先,我們在ViewController中先遵守協議:

我們可以先創建一個WKWebView的配置項WKWebViewConfiguration,這可以設置偏好設置,與網頁交互的配置,注入對象,注入js等:

創建對象並遵守代理:

加載我們的本地HTML頁面:

我們再添加前進、后退按鈕和添加一個加載進度的控制顯示在Webview上:

 

頁面前進、后退

對於前進后退的事件處理就很簡單的,要注意判斷一下是否可以后退、前進才調用:

當然除了這些方法之處,還有重新載入等。

WKWebView的KVO

對於WKWebView,有三個屬性支持KVO,因此我們可以監聽其值的變化,分別是:loading,title,estimatedProgress,對應功能表示為:是否正在加載中,頁面的標題,頁面內容加載的進度(值為0.0~1.0)

然后就可以重寫監聽的方法來處理。這里只是取頁面的標題,更新加載的進度條,在加載完成時,手動調用執行一個JS方法:

 

WKUIDelegate

我們看看WKUIDelegate的幾個代理方法,雖然不是必須實現的,但是如果我們的頁面中有調用了js的alert、confirm、prompt方法,我們應該實現下面這幾個代理方法,然后在原來這里調用native的彈出窗,因為使用WKWebView后,HTML中的alert、confirm、prompt方法調用是不會再彈出窗口了,只是轉化成ios的native回調代理方法:

 

WKScriptMessageHandler

接下來,我們看看WKScriptMessageHandler,這個是注入js名稱,在js端通過window.webkit.messageHandlers.{InjectedName}.postMessage()方法來發送消息到native。我們需要遵守此協議,然后實現其代理方法,就可以收到消息,並做相應處理。這個協議只有一個方法:

這個方法是相當好的API,我們給js注入一個名稱,就會自動轉換成js的對象,然后就可以發送消息到native端。

WKNavigationDelegate

還有一個非常關鍵的代理WKNavigationDelegate,這個代理有很多的代理方法,可以控制頁面導航。

其調用順序為: 1、這個代理方法是用於處理是否允許跳轉導航。對於跨域只有Safari瀏覽器才允許,其他瀏覽器是不允許的,因此我們需要額外處理跨域的鏈接。

2、開始加載頁面內容時就會回調此代理方法,與UIWebViewdidStartLoad功能相當

3、決定是否允許導航響應,如果不允許就不會跳轉到該鏈接的頁面。

4、Invoked when content starts arriving for the main frame.這是API的原注釋。也就是在頁面內容加載到達mainFrame時會回調此API。如果我們要在mainFrame中注入什么JS,也可以在此處添加。

5、加載完成的回調

如果加載失敗了,會回調下面的代理方法:

其實在還有一些API,一般情況下並不需要。如果我們需要處理在重定向時,需要實現下面的代理方法就可以接收到。

如果我們的請求要求授權、證書等,我們需要處理下面的代理方法,以提供相應的授權處理等:

當我們終止頁面加載時,我們會可以處理下面的代理方法,如果不需要處理,則不用實現之:

 

源代碼

具體代碼已經發布到github:https://github.com/CoderJackyHuang/WKWebViewTestDemo

總結

蘋果已經向我們提供了WKWebView,擁有UIWebView的所有功能,且還提供更多的功能,明示是為了替代UIWebView,但是WKWebView要在ios8.0之后才能使用,因此,如果我們使用Swift來開發應用,兼容版本從8.0開始時,可以直接使用WKWebView

我們可以發現,蘋果提供了更多簡便的方式讓native與js交互更加方便,通過讓native注入名稱,然后在js端自動轉換成js的對象,就可以在js端通過對象的方式來發送消息到native端。如此一來,就簡化了js與native的交互了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM