首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Swift WKWebView中捕获WKWebView

在Swift WKWebView中捕获WKWebView
EN

Stack Overflow用户
提问于 2019-06-20 19:03:47
回答 1查看 13.8K关注 0票数 10

我正在开发一个快速的ios应用程序,它使用WKWebView加载一个电子商务站点。

当用户在这里购买产品时,结帐页面允许用户使用加密货币付款。

当用户单击“在钱包中打开”时,网站就会发出一个window.postMessage(paymentData),其中支付数据是一个js对象,其中包含一个比特币url。

我使用WKUserScriptWKWebConfiguration注入一个脚本,该脚本侦听窗口消息,然后将数据发送给我的webkit.messageHandler.

代码语言:javascript
复制
let source = """
    window.addEventListener('message', function(e) { window.webkit.messageHandlers.iosListener.postMessage(JSON.stringify(e.data)) } )
    """

不幸的是,这段代码永远不会触发。

当我使用chrome或safari注入相同的javascript时,它工作得很好。

我已经搜索了堆栈溢出,以查看window.postMessageWKWebView中是否有特殊的条件,但是到目前为止还没有得到任何结果。

是否有可能捕获window.postMessage()事件并将事件数据输送回我的ios应用程序?

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

代码语言:javascript
复制
  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)
代码语言:javascript
复制
 func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    print("message body: \(message.body)")
    print("message frameInfo: \(message.frameInfo)")
  }
EN

回答 1

Stack Overflow用户

发布于 2019-06-20 19:39:17

是的,这是可能的。您还需要设置javascriptEnabled = true

代码语言:javascript
复制
self.webView.configuration.preferences.javaScriptEnabled = true

您还可以像这样配置监听器:

代码语言:javascript
复制
self.webView.configuration.userContentController.add(self, name: "iosListener")

并确保您之前应用了这两个命令

代码语言:javascript
复制
self.webView.load(/*some request*/)

在加载页面didFinish之后,可以使用以下内容进行简单测试:

代码语言:javascript
复制
self.webView.evaluateJavaScript("window.webkit.messageHandlers.iosListener.postMessage('test');", completionHandler: { (result, err) in
    if (err != nil) {
        // show error feedback to user.
    }
})

另一个建议是,在与;交互时,始终在javascript代码的命令末尾设置webView,因为有些人可以依赖标准的javascript。

代码语言:javascript
复制
let source = """
    window.addEventListener('message', function(e) {
        window.webkit.messageHandlers.iosListener.postMessage(JSON.stringify(e.data));
    });
    """

注意:我还建议将webView作为类变量而不是方法变量,您可能是在viewDidLoad()上创建它,我建议您将该变量移到类中。

var webView: WKWebView!

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56692368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档