如何在 ios 收到来自 javascript 的回调?

How to receive callback in ios from javascript?

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

Swift Part

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))
    }
}

And

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);
}

其中消息可以是任何字符串,例如:"success"

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

UPDATE

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

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

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)
  }
}

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

我通过注入 javascript 函数的重载解决了这个问题,保持主体与外部 .js 文件中的主体相同,并将其注入到文档的末尾。

感谢@Andy 提出在文档中注入 userScript 的想法。如果其他人面临同样的问题但不是问题的答案,此信息可能会派上用场 "How to receive callback in ios from javascript?" 所以@Andy 的回答被接受,因为它准确地回答了问题。