在JavaScript中调用本地Swift函数

5

很抱歉,如果这个问题已经被提过了,但我能找到的所有答案都是复杂的解决方案。

我有一个视图控制器,它是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部分调用这个函数。据我所知,如果我想在Swift中调用javascript函数,我只需要这样说:

 webview.addJavascriptInterface('javascript: function_name();')

然而,在我的情况下,我希望按相反的顺序执行。在 JavaScript 代码中调用 Swift 函数。

1个回答

3

您需要将用户脚本注入到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.")
        }
    }
}

我希望这对你有用。我假设你正在访问的网站上实现了 JavaScript 中的 showRewardsAd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接