近期由于项目需求,在用UIWebView 加载网页的时候,发现网页上面有莫名的异常,然后用WKWebView加载没有上述问题,想到可能是UIWebView 的问题,而是果断换了,现在分享一些经验。
㈠、后台对于iOS端做的很简单,就是只需要一段代码就可以如下:
window.webkit.messageHandlers.input.postMessage(null);
input:为注入JS的对象,这个名称可以前端定义,也可以iOS移动端定义;
唯一需要前端多做点的就是需要做一下平台判断。
iOS平台需要:
import WebKit
/// 配置网页视图:
let webConfiguration = WKWebViewConfiguration()
WKWebViewConfiguration,可以配置网页显示的属性,不过一般不做操作,除非有特殊要求;
/**
* WKUserContentController 用于给JS注入对象,注入对象后,JS端就可以使用
*/
// 通过JS与webview内容交互
let userContentController = WKUserContentController()
userContentController.add(self, name: "input")
//
webConfiguration.userContentController = userContentController
extension WebViewViewController: WKScriptMessageHandler {
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
VCUtils.dPrint("message.body:\(message.body)")
var bodyDict: Dictionary = [String: Any]()
if message.name == "input" {
self.input()
}
}
private func input() {
// "show('\(accountManager.account.getMobileNo())', '\(accountManager.account.userInfo.customerName)', '\(accountManager.account.userInfo.idNo)')"该字符串为iOS传递给JS的数据 ,show 为JS端接收方法名称
self.webView.evaluateJavaScript("show('\(accountManager.account.getMobileNo())', '\(accountManager.account.userInfo.customerName)', '\(accountManager.account.userInfo.idNo)')") { (result, error) in
print("input result::\(String(describing: result))")
}
写完瞬间感觉完爆UIWebView有木有,比它简单多了。
此例已经在我的项目代码中亲测有效,并且已经上线使用,所以大家可以放心使用,不过此处我只提供一些WKWebView与 JS交互的方式和前端需要做的事情,并未阐述WKWebView 内部API,需要了解的可以点击下面的链接。最后初始化之后一定要实现其协议,否则协议下面的方法无法调用。
WKWebView