swift原生调用JS
注意要在WKWebView加载完成之后再调用
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
// say()是JS的方法
webView.evaluateJavaScript("say('WebView你好!')") { (result, err) in
print(result, err)
}
}
JS调用swift原生
1.初始化WKWebView
lazy var webView: WKWebView = {
let preferences = WKPreferences()
preferences.javaScriptEnabled = true
let configuration = WKWebViewConfiguration()
configuration.preferences = preferences
let userContentController = WKUserContentController()
configuration.userContentController = userContentController
// 给WKWebView与Swift交互起一个名字:callback
configuration.userContentController.add(self, name: "callback")
var webView = WKWebView(frame: self.view.frame, configuration: configuration)
// 回弹效果
webView.scrollView.bounces = true
// 只允许上下滚动
webView.scrollView.alwaysBounceVertical = true
// WKNavigationDelegate代理
webView.navigationDelegate = self
return webView
}()
2.实现代理方法
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
print(message.body)
}
3.防止内存泄漏
//防止内存泄漏
deinit {
webView.configuration.userContentController.removeScriptMessageHandler(forName: "finishWebView")
}
4.JS代码
// 调用Swift方法
function responseSwift() {
// 这里的callback是创建WKWebViewConfiguration时定义的
window.webkit.messageHandlers.callback.postMessage("JS发送消息给Swift")
}
5.WKWebView的load方法时机很重要,最好是在addSubview之前,如果没有刷新的话,可以放在初始化WKWebView里面,不然可能会在模拟器上点了web前端的按钮不会走原生的代理方法,如果是本地的HTML那在哪里加载都不会有问题。
var request = URLRequest(url: self.url, cachePolicy: URLRequest.CachePolicy.returnCacheDataElseLoad, timeoutInterval: 60)
self.webView.load(request)
网友评论