美文网首页
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