Как получить обратный звонок в ios от javascript? - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь вызвать нативную функцию в swift из wkwebview. Это то, что я сделал до сих пор:

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

И

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 метод

ОБНОВЛЕНИЕ

Я также пытался отправить данные в качестве значения ключа, например window.webkit.messageHandlers.backHomePage.postMessage({"message" :"Javascript to swift!"});, но он все еще не работал.

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Хорошо, проблема в моем случае заключалась в том, что вызов window.webkit.messageHandlers.backHomePage.postMessage(message); был внутри файла. js, который был загружен извне, и я действительно не знаю, почему он не вызывался.

Я решил это устранить проблему, введя перегрузку функции javascript, сохранив тело таким же, как и во внешнем файле. js, и добавив его в конец документа.

Спасибо @Andy за предложение идея внедрения userScript в документ. Эта информация может пригодиться, если кто-то еще сталкивается с той же проблемой, но не является ответом на вопрос «Как получить обратный вызов в ios от javascript?» поэтому @ ответ Энди принят, поскольку он точно отвечает на вопрос.

0 голосов
/ 13 апреля 2020

Я попытался воспроизвести ваш случай, и все, кажется, работает как ожидалось

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