我如何从 JS 通信到 Swift
How do I communicate from JS to Swift
我正在创建一个混合应用程序,我正在尝试弄清楚如何将一些数据从 WKWebView 传递到本机应用程序。
几天来我一直在努力解决这个问题,但我似乎找不到任何东西!网上关于这方面的信息似乎很少,而我找到的所有信息都是相反的(Swift 到 JS,而不是 JS 到 Swift)。
我试过使用 URL 变量,但 Webview 必须重新加载 Swift 才能识别它已更改。我尝试使用 WKScriptMessageHandler,但我找不到任何关于它的好文档,而且它看起来很复杂。
一定有一些简单的方法可以做到这一点。
有什么想法吗?
如果有人能帮助我,我将不胜感激。
其实并没有那么复杂。
首先,您必须将脚本消息处理程序添加到内容控制器中。
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
然后您需要将配置分配给您的网络视图。
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"]
}
}
我正在创建一个混合应用程序,我正在尝试弄清楚如何将一些数据从 WKWebView 传递到本机应用程序。
几天来我一直在努力解决这个问题,但我似乎找不到任何东西!网上关于这方面的信息似乎很少,而我找到的所有信息都是相反的(Swift 到 JS,而不是 JS 到 Swift)。
我试过使用 URL 变量,但 Webview 必须重新加载 Swift 才能识别它已更改。我尝试使用 WKScriptMessageHandler,但我找不到任何关于它的好文档,而且它看起来很复杂。
一定有一些简单的方法可以做到这一点。 有什么想法吗?
如果有人能帮助我,我将不胜感激。
其实并没有那么复杂。
首先,您必须将脚本消息处理程序添加到内容控制器中。
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
然后您需要将配置分配给您的网络视图。
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"]
}
}