在 javascript 中调用本机 swift 函数
Call native swift function in javascript
很抱歉,如果这个问题已经被问过,但我能找到的所有答案都是针对复杂的解决方案。
我有一个viewController,就是webView。我将 WKWebView
添加到 WebKit 库的视图中,并打开了简单的 url。在我的 ViewController 中,我有一个名为 showAd
的本机函数。
当用户按下 javascript 中实现的按钮时,它显示调用 showRewardsAd
。我将断点设置到 userContentController,但是,它永远不会到那里。
func showAd(){
print("invoked")
}
extension WFWebViewController: WKScriptMessageHandler{
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if message.name == "showRewardsAd"{
self.showRewards()
webView.evaluateJavaScript("test", completionHandler: nil)
}
}
}
我的目标是简单地允许从 javascript 部分调用此函数。据我所知,如果我想在 swift 中调用 javascript 函数,我只需要说:
webview.addJavascriptInterface('javascript: function_name();')
但是,就我而言,我想以相反的顺序进行。在 Javascript 代码中调用 swift 函数。
您需要在 webView 中注入您的用户脚本,这样您就可以在 JavaScript 发布消息时收听它们。
首先,您需要初始化 webView 的配置和首选项,以允许 javaScript:
let config = WKWebViewConfiguration()
let preferences = WKPreferences()
preferences.javaScriptEnabled = true
config.preferences = preferences
现在,您需要注入脚本来监听来自 webView 的点击事件:
let userController = WKUserContentController()
let javaScript = "showRewardsAd = function() {\n" + "window.webkit.messageHandlers.adClicked.postMessage(); }"
let script = WKUserScript(source: javaScript, injectionTime: .atDocumentEnd, forMainFrameOnly: false)
userController.addUserScript(script)
userController.add(self, name: "adClicked")
config.userContentController = userController
现在使用上面的配置实例化您的 webView:
self.webView = WKWebView(frame: .zero, configuration: config)
现在,您的 WKScriptMessageHandler
协议已正确实施:
extension WFWebViewController: WKScriptMessageHandler{
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if message.name == "showRewardsAd"{
self.showRewards()
print("Ad is being shown.")
}
}
}
我希望这对你有用。我假设 showRewardsAd
是在您正在访问的网站上的 JavaScript 中实现的。
很抱歉,如果这个问题已经被问过,但我能找到的所有答案都是针对复杂的解决方案。
我有一个viewController,就是webView。我将 WKWebView
添加到 WebKit 库的视图中,并打开了简单的 url。在我的 ViewController 中,我有一个名为 showAd
的本机函数。
当用户按下 javascript 中实现的按钮时,它显示调用 showRewardsAd
。我将断点设置到 userContentController,但是,它永远不会到那里。
func showAd(){
print("invoked")
}
extension WFWebViewController: WKScriptMessageHandler{
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if message.name == "showRewardsAd"{
self.showRewards()
webView.evaluateJavaScript("test", completionHandler: nil)
}
}
}
我的目标是简单地允许从 javascript 部分调用此函数。据我所知,如果我想在 swift 中调用 javascript 函数,我只需要说:
webview.addJavascriptInterface('javascript: function_name();')
但是,就我而言,我想以相反的顺序进行。在 Javascript 代码中调用 swift 函数。
您需要在 webView 中注入您的用户脚本,这样您就可以在 JavaScript 发布消息时收听它们。
首先,您需要初始化 webView 的配置和首选项,以允许 javaScript:
let config = WKWebViewConfiguration()
let preferences = WKPreferences()
preferences.javaScriptEnabled = true
config.preferences = preferences
现在,您需要注入脚本来监听来自 webView 的点击事件:
let userController = WKUserContentController()
let javaScript = "showRewardsAd = function() {\n" + "window.webkit.messageHandlers.adClicked.postMessage(); }"
let script = WKUserScript(source: javaScript, injectionTime: .atDocumentEnd, forMainFrameOnly: false)
userController.addUserScript(script)
userController.add(self, name: "adClicked")
config.userContentController = userController
现在使用上面的配置实例化您的 webView:
self.webView = WKWebView(frame: .zero, configuration: config)
现在,您的 WKScriptMessageHandler
协议已正确实施:
extension WFWebViewController: WKScriptMessageHandler{
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if message.name == "showRewardsAd"{
self.showRewards()
print("Ad is being shown.")
}
}
}
我希望这对你有用。我假设 showRewardsAd
是在您正在访问的网站上的 JavaScript 中实现的。