【问题标题】:How to receive callback in ios from javascript?如何从javascript接收ios回调?
【发布时间】:2020-07-25 15:44:13
【问题描述】:

我正在尝试从 wkwebview 快速调用本机函数。这是我到目前为止所做的:

斯威夫特部分

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    contentController.add(self, name: "backHomePage")

    config.userContentController = contentController
    self.webView = WKWebView(frame: self.containerView.bounds, configuration: config)

    webView.navigationDelegate = self

    self.containerView.addSubview(self.webView)
    if let url = URL(string: assessmentLink) {
        webView.load(URLRequest(url: url))
    }
}

还有

extension WebFormVC: WKScriptMessageHandler {
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        print("javascript sending \(message.name), body: \(message.body)")
    }
}

Javascript

function backHomePage(message) {
    window.webkit.messageHandlers.backHomePage.postMessage(message);
}

其中消息可以是任何字符串,例如:“成功”

我目前没有在userContentController didReceive 方法中收到回电

更新

我还尝试将数据作为键值发送,例如 window.webkit.messageHandlers.backHomePage.postMessage({"message" :"Javascript to swift!"}); ,但还是不行。

【问题讨论】:

    标签: javascript ios swift wkwebview


    【解决方案1】:

    好的,所以我的问题是对 window.webkit.messageHandlers.backHomePage.postMessage(message); 的调用位于外部加载的 .js 文件中,我真的不知道为什么没有调用它。

    我通过注入 javascript 函数的重载来解决这个问题,保持正文与外部 .js 文件中的相同,并在文档末尾注入它。

    感谢@Andy 提出在文档中注入 userScript 的想法。如果其他人面临同样的问题,这些信息可能会派上用场,但不是“如何在 ios 中从 javascript 接收回调?”问题的答案。所以@Andy 的回答被接受了,因为它准确地回答了这个问题。

    【讨论】:

      【解决方案2】:

      我已尝试重现您的情况,一切似乎都按预期工作

      import UIKit
      import WebKit
      
      class ViewController: UIViewController, WKScriptMessageHandler {
        let content = """
        <!DOCTYPE html><html><body>
        <button onclick="onClick()">Click me</button>
        <script>
        function onClick() {
          window.webkit.messageHandlers.backHomePage.postMessage("success");
        }
        </script>
        </body></html>
        """
      
        override func viewDidLoad() {
          super.viewDidLoad()
      
          let config = WKWebViewConfiguration()
          config.userContentController = WKUserContentController()
          config.userContentController.add(self, name: "backHomePage")
      
          let webView = WKWebView(frame: CGRect(x: 0, y: 0, width: 200, height: 200), configuration: config)
      
          view.addSubview(webView)
      
          webView.loadHTMLString(content, baseURL: nil)
        }
      
        func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
          print(message.body)
        }
      }
      

      【讨论】:

      • 有问题的脚本已经存在于通过 wkwebview 访问的网页中,并在网页中的适当按钮单击时被调用。我还需要向 userContentController 添加脚本吗?
      • 我没有尝试在不向控制器添加脚本的情况下执行此操作。
      • javascript函数在网页上,当用户点击该页面中表单的提交按钮时调用。 message 参数将是字符串,作为“成功”或“失败”等操作的结果
      • 好的@Andy所以将一个简单的网页作为字符串并将其加载到webview中可以按预期工作,但是当webview通过互联网加载我的网页时它仍然不起作用。是否存在 webview 无法从 .js 文件加载外部 js 等问题?正在加载的网页使用外部 .js 文件作为脚本,并且该文件包含回调。
      • @KishanSadhwani 您是否在应用程序中链接了 WebKit 框架?我不知道为什么它不适用于外部 .js 文件。当你解决这个问题时让我知道。祝你好运!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-12
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      • 2013-07-26
      • 2020-10-25
      • 1970-01-01
      相关资源
      最近更新 更多