Как вызвать почтовое сообщение в WKWebview на JS? - PullRequest
0 голосов
/ 27 мая 2020

Привет, я хочу спросить, у меня проблема в WKWebView IOS

Я хочу отправить сообщение на JS вот так

 window.webkit.messageHandlers.postMessageListener.postMessage(JSON.stringify({data}))

, но в * ничего не произошло 1018 *

иначе в android

"window.postMessage(JSON.stringify({data}))"

точно так же и JS Дайте ответ на это

Теперь я хочу спросить, что не так с моим скриптом ?

извините за плохой engli sh грамматика

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

Отправка данных с WKWebview's веб-страницы в собственный код с использованием postMessage обработчика,

import UIKit
import WebKit

class ViewController: UIViewController, WKScriptMessageHandler {

    lazy var webView: WKWebView = {
        let   webCfg:WKWebViewConfiguration = WKWebViewConfiguration()

        // Setup WKUserContentController instance for injecting user script
        var userController:WKUserContentController = WKUserContentController()

        // Add a script message handler for receiving  "buttonClicked" event notifications posted from the JS document using  window.webkit.messageHandlers.postMessageListener.postMessage(JSON.stringify({data})) script message
        userController.add(self, name: "nativeListener")
        // Configure the WKWebViewConfiguration instance with the WKUserContentController
        webCfg.userContentController = userController;

        let webView = WKWebView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height), configuration: webCfg)
        return webView
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        webView.configuration.preferences.javaScriptEnabled = true
        self.view.addSubview(webView)
        let urlToLoad  = URL(string: "your_url_string")
        // Do any additional setup after loading the view.
        webView.load(URLRequest(url:urlToLoad!))
    }


    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
     if message.name == "nativeListener" {
          print(message.body) // prints the data that is sent from javascript
       }
    }
}
0 голосов
/ 27 мая 2020

Для простого объяснения вы можете проверить эту статью:

https://medium.com/@hoishing / using- javascript -with-wkwebview-64f94153ad0

Если хотите более глубокое объяснение, вы можете проверить эту другую статью:

https://dev.to/gualtierofr/wkwebview-and-javascript-interaction-1pbl

В обоих упоминается, как Запуск Javascript Функции из Swift И Получение Javascript Сообщения

В любом случае, если вы выполните эту функцию в JavaScript:

window.webkit.messageHandlers.postMessageListener.postMessage(JSON.stringify({data}))

Вы должны прослушивать в Swift имя postMessageListener таким образом:

Настройка WKWebView

let preferences = WKPreferences()
preferences.javaScriptEnabled = true
let configuration = WKWebViewConfiguration()
configuration.preferences = preferences

// Here I am guessing that the Frame of the WebView is the entire Screen
let webView = WKWebView(frame: view.frame, configuration: configuration)


configuration.userContentController.add(self, name: "postMessageListener")

Соответствие протоколу WKScriptMessageHandler

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
   if message.name == "postMessageListener" {
       // Manage your Data
   }
}
...