我如何从JS与Swift进行通信

时间:2017-12-18 00:00:33

标签: javascript ios swift webview wkwebview

我正在创建一个混合应用程序,而我正试图弄清楚如何将一些数据从WKWebView传递到本机应用程序。

我一直试图解决这个问题好几天,我似乎无法找到任何东西!关于这一点似乎在网上的信息很少,我找到的一切都是相反的(Swift到JS,而不是JS到Swift)。

我尝试过使用网址变量,但Webview必须重新加载以便Swift识别它已发生变化。我尝试使用WKScriptMessageHandler,但我找不到任何关于它的好文档,而且看起来非常复杂。

必须有一些简单的方法来实现这一目标。 有什么想法吗?

我真的很感激能帮助我的人。

1 个答案:

答案 0 :(得分:8)

实际上并不复杂。

首先,您必须将脚本消息处理程序添加到内容控制器中。

let contentController = WKUserContentController()
contentController.add(self, name: "derp") //name is the key you want the app to listen to.

接下来,您必须将内容控制器分配到配置中。

let config = WKWebViewConfiguration()
config.userContentController = contentController

然后您需要将配置分配给您的Web视图。

let webView = WKWebView(frame: CGRect.zero, configuration: config) //set your own frame

和JS方面。

var message = {'fruit':'apple'};
window.webkit.messageHandlers.derp.postMessage(message);

最后,你必须让你的视图控制器(我假设webView在视图控制器中)符合WKScriptMessageHandler协议。我已按要求将其余代码添加到示例视图控制器中。

class MyViewController: UIViewController, WKScriptMessageHandler {

    override func viewDidLoad() {

        super.viewDidLoad()

        let contentController = WKUserContentController()
        contentController.add(self, name: "derp")

        let config = WKWebViewConfiguration()
        config.userContentController = contentController

        let webView = WKWebView(frame: self.view.frame, configuration: config) //you can consider using auto layout though
        self.view.addSubview(webView)

        //load your url here 
    }

    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {

        //handle script messages here
        //message.name is "derp"
        //message.body is ["fruit":"apple"]
    }
}