在Swift WKWebView

时间:2019-06-20 19:03:47

标签: javascript ios swift native wkwebview

我正在开发一个使用WKWebView来加载电子商务网站的快速ios应用。
当用户在此处购买产品时,结帐页面允许用户以加密货币付款。

当用户单击“在电子钱包中打开”时,该网站将射击 window.postMessage(paymentData) 付款数据是其中包含比特币网址的js对象。

我正在将WKUserScriptWKWebConfiguration一起使用,以注入一个脚本,该脚本侦听窗口消息,然后将数据发射到我的webkit.messageHandler.

let source = """
    window.addEventListener('message', function(e) { window.webkit.messageHandlers.iosListener.postMessage(JSON.stringify(e.data)) } )
    """

不幸的是,此代码从未触发。

当我使用chrome或safari devtools注入相同的javascript时,效果很好。

我已经检查了堆栈溢出情况,以查看window.postMessageWKWebView是否有特殊情况,但是到目前为止还没有运气。

是否可以捕获window.postMessage()事件并将事件数据通过管道传回我的ios应用?

提前谢谢!!! 这是我现有的代码。

  let webConfiguration = WKWebViewConfiguration()
    let source = """
    window.addEventListener('message', function(e) { window.webkit.messageHandlers.iosListener.postMessage(JSON.stringify(e.data)) } )
    """
    let script = WKUserScript(source: source, injectionTime: .atDocumentEnd, forMainFrameOnly: false)
    userContentController.addUserScript(script)

    userContentController.add(self, name: "iosListener")
    webConfiguration.userContentController = userContentController
    webView = WKWebView(frame: .zero, configuration: webConfiguration)
    webView.uiDelegate = self
    webView.navigationDelegate = self
    webView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(webView)
 func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    print("message body: \(message.body)")
    print("message frameInfo: \(message.frameInfo)")
  }

1 个答案:

答案 0 :(得分:1)

是的,有可能。您还需要设置use warnings; use open ':encoding(utf8)'; binmode(STDOUT, ":utf8"); print "\x{4DC0}\n";

javascriptEnabled = true

您还可以这样配置侦听器:

self.webView.configuration.preferences.javaScriptEnabled = true

并确保您同时应用了这两个命令

self.webView.configuration.userContentController.add(self, name: "iosListener")

您可以在页面self.webView.load(/*some request*/) 加载后进行以下简单测试:

didFinish

另一建议是,在与self.webView.evaluateJavaScript("window.webkit.messageHandlers.iosListener.postMessage('test');", completionHandler: { (result, err) in if (err != nil) { // show error feedback to user. } }) 进行交互时,请始终在JavaScript代码的命令末尾加上;,因为有些人可以依赖标准javascript。

webView

注意:我还建议将let source = """ window.addEventListener('message', function(e) { window.webkit.messageHandlers.iosListener.postMessage(JSON.stringify(e.data)); }); """ 作为类变量而不是方法变量,您可能正在webView上创建它,我是d建议您将变量移至班级。

viewDidLoad()