蘋果在WKWebView上做的最讚的事兒就是顯式的支持了js通信。用法很簡單:
一個協議:WKScriptMessageHandler 一個類:WKUserContentController
創建一個實例A,該實例遵循WKScriptMessageHandler協議,並將實例A與WKWebView綁定(有一個共同的對象持有他們倆即可),這樣,實例A便可以獲得與WKWebView對應的WKUserContentController實例B(WKWebView.configuration.userContentController)。實例B的方法:
- (void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name;
通過這個方法將實例A傳給scriptMessageHandler,然後自定義一個name。後續h5就可以通過一套標準的接口找到js處理的響應器。
window.webkit.messageHandlers.name.postMessage({
'method': 'notifyMessageToNative',
'params': jsonString
});
而WKScriptMessageHandler協議只有一個方法:
/*! @abstract Adds a script message handler.
@param scriptMessageHandler The message handler to add.
@param name The name of the message handler.
@discussion Adding a scriptMessageHandler adds a function
window.webkit.messageHandlers.<name>.postMessage(<messageBody>) for all
frames.
*/
- (void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name;
實例A中實現這個方法,它會從WKScriptMessage對象中拿到所有h5傳遞過來的信息,你只要處理即可。
是不是用着很爽??????
但是這裏有個坑,一不小心就會造成內存泄露。
這裏webkit對你傳入的scriptMessageHandler是一個強引用。當確定自己的WebView不需要接受js消息時(如自己的WebView將要釋放),就要把scriptMessageHandler移除。方法很簡單:
與前面addScriptMessageHandler對應的,有一個remove方法:
/*! @abstract Removes a script message handler.
@param name The name of the message handler to remove.
*/
- (void)removeScriptMessageHandlerForName:(NSString *)name;
調用即可。
這裏希望大家對與WebView相關的內存管理要高度敏感,畢竟有泄露的話量會很大。切記!!!