美文网首页
JS和swift通过WKWebView互相调用

JS和swift通过WKWebView互相调用

作者: SuJunJun | 来源:发表于2023-06-18 16:41 被阅读0次

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)

相关文章

网友评论

      本文标题:JS和swift通过WKWebView互相调用

      本文链接:https://www.haomeiwen.com/subject/puhsydtx.html