Как перехватить сообщение, отправленное родительскому элементу с помощью WKScriptMessageHandler? - PullRequest
0 голосов
/ 13 сентября 2018

Я загружаю URL в WKWebView, который отправляет сообщение в родительский элемент:

window.parent.test.postMessage('A message')

Я реализую WKScriptMessageHandler и пытаюсь получить это сообщение, используя userController (didReceiveMessage), но оно никогда не вызывается:

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    if(message.name == "test") {
        print("JavaScript is sending a message \(message.body)")
    }
}

Я думаю, это потому, что сообщение отправляется на родительский элемент, и я загружаю веб-представление напрямую, не загружая родительский элемент (у меня нет доступа к родительскому элементу). Есть ли способ перехватить сообщение от родителя, не загружая этого родителя в мой WKWebView?

1 Ответ

0 голосов
/ 13 сентября 2018

Использование в JavaScript:

webkit.messageHandlers.yourCustomName.postMessage(...)

Внутри стремительного:

webKitViewController = segue.destination as? CustomViewControllerWithWebView

if let userContentController = webKitViewController?.webView?.configuration.userContentController {
    userContentController.add(self, name: "yourCustomName")

Сделать расширение себя:

extension MyController: WKScriptMessageHandler
{
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        print("received message:\n\(message.body)")
    }
}

Если вы не можете редактировать javascript, дождитесь события didload в веб-просмотре и загрузите строку с javascipt, который переопределит тестовую функцию postMessage. Так что он будет перенаправлен на ваш обработчик webkit.

webView.evaluateJavascript("window.parent.test.postMessage = function(message) {
  webkit.messageHandlers.yourCustomName.postMessage(message)}")
...