自詡擁有 60fps 滾動刷新率、內置手勢、高效的 app 和 web 信息交換通道、和 Safari 相同的 JavaScript 引擎,WKWebView?毫無疑問地成為了 WWDC 2014 上的最亮點。
WKWebview提供了API實現js交互 不需要借助JavaScriptCore或者webJavaScriptBridge。使用WKUserContentController實現js native交互。簡單的說就是先註冊約定好的方法,然後再調用。
UIWebView?&?UIWebViewDelegate?這個兩個東西是如何在 WKWebKit 中被重構成 14 個類 3 個協議的呢。
1.WKBackForwardList: 之前訪問過的 web 頁面的列表,可以通過後退和前進動作來訪問到。
WKBackForwardListItem: webview 中後退列表裏的某壹個網頁。
2.WKFrameInfo: 包含壹個網頁的布局信息。
3.WKNavigation: 包含壹個網頁的加載進度信息。
WKNavigationAction: 包含可能讓網頁導航變化的信息,用於判斷是否做出導航變化。
WKNavigationResponse: 包含可能讓網頁導航變化的返回內容信息,用於判斷是否做出導航變化。
4.WKPreferences: 概括壹個 webview 的偏好設置。
5.WKProcessPool: 表示壹個 web 內容加載池。
6.WKUserContentController: 提供使用 JavaScript post 信息和註射 script 的方法。
WKScriptMessage: 包含網頁發出的信息。
WKUserScript: 表示可以被網頁接受的用戶腳本。
WKWebViewConfiguration: 初始化 webview 的設置。
7.WKWindowFeatures: 指定加載新網頁時的窗口屬性。
1.WKNavigationDelegate: 提供了追蹤主窗口網頁加載過程和判斷主窗口和子窗口是否進行頁面加載新頁面的相關方法。
2.WKScriptMessageHandler: 提供從網頁中收消息的回調方法。
3.WKUIDelegate: 提供用原生控件顯示網頁的方法回調
WKWebView?繼承了?UIWebView?大部分的接口,這讓 app 來繼承 WKWebKit 也簡單了許多(同時隨著更新 iOS 8 的越來越多這也成為了某種必需)。
有興趣的同學可以看壹下這兩個類的 API 區別:
相對於?UIWebView?最大的提升就是數據在可以 app 和 web 內容之間傳遞。
WKUserScript?允許在正文加載之前或之後註入到頁面中。這個強大的功能允許在頁面中以安全且唯壹的方式操作網頁內容。
壹個簡單的例子如下,用戶改變背景的用戶腳本被插入到網頁中:
WKUserScript?對象可以以 JavaScript 源碼形式初始化,初始化時還可以傳入是在加載之前還是結束時註入,以及腳本影響的是這個布局還是僅主要布局。於是用戶腳本被加入到?WKUserContentController?中,並且以?WKWebViewConfiguration?屬性傳入到?WKWebView?的初始化過程中。
這個樣例可以簡單擴展為更為高級的頁面修改方法,例如去除廣告、隱藏評論等,更復雜的樣例見此: 讓所有出現的”the cloud”變為”my butt” 。
就想在 Safari 審查元素 功能中的?console.log?能在調試終端打印信息壹樣,網頁中的信息也可以通過調用這個函數被傳到 app 裏:
window.webkit.messageHandlers.{NAME}.postMessage()
這個 API 真正神奇的地方在於 JavaScript 對象可以_自動轉換_為 Objective-C 或 Swift 對象。
Handler 的名字可以通過?WKScriptMessageHandler?協議中的?addScriptMessageHandler()?接口函數設置:
於是當通知進入 app 的時候,比如說在頁面中創建壹個新對象,相關信息就可以這樣傳遞:
添加用戶腳本來對 web 事件監聽並用 Message Handler 將信息傳回 app。
同樣的方法也可以用來收集頁面信息用於 app 的頁面展示或數據分析。
例如,如果某人要針對 NSHipster.com 做壹個特別的瀏覽器,就可以加壹個能夠呼出相似文章列表的按鈕: