【问题标题】:Call native swift function in javascript在javascript中调用本机swift函数
【发布时间】:2021-01-30 15:04:40
【问题描述】:

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

我有一个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 部分调用此函数。据我所知,如果我想在 swift 中调用 javascript 函数,我只需要说:

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

但是,就我而言,我想以相反的顺序进行。在 Javascript 代码中调用 swift 函数。

【问题讨论】:

    标签: javascript ios swift webkit


    【解决方案1】:

    您需要在 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 中实现的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-07
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      相关资源
      最近更新 更多