繁体   English   中英

在javascript中调用本机swift函数

[英]Call native swift function in javascript

对不起,如果这个问题已经被问到,但我能找到的所有答案都是针对复杂的解决方案。

我有一个viewController,它是webView。 我从 WebKit 库WKWebView添加到我的视图中,并打开了简单的 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 部分调用这个函数。 据我所知,如果我想快速调用 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 中实现的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM