【发布时间】:2019-06-20 19:03:47
【问题描述】:
我正在开发一个使用 WKWebView 加载电子商务网站的 swift ios 应用程序。
当用户在这里购买产品时,结帐页面允许用户以加密货币付款。
当用户点击“在钱包中打开”时,网站会发出一个
window.postMessage(paymentData)
其中支付数据是一个带有比特币 url 的 js 对象。
我正在使用WKUserScript 和WKWebConfiguration 来注入一个脚本,该脚本侦听窗口消息,然后将数据发送到我的webkit.messageHandler.
let source = """
window.addEventListener('message', function(e) { window.webkit.messageHandlers.iosListener.postMessage(JSON.stringify(e.data)) } )
"""
不幸的是,这段代码永远不会触发。
当我使用 chrome 或 safari devtools 注入相同的 javascript 时,它工作得很好。
我已经搜索了堆栈溢出,以查看 window.postMessage 在 WKWebView 中是否存在特殊情况,但到目前为止还没有运气。
是否可以捕获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)")
}
【问题讨论】:
-
你解决了吗?考虑支持/接受/与答案互动,为网站生成有价值的知识。提出一个问题然后再也不回答它不是一个好习惯。
-
嗨@GustavoVollbrecht。我正在度假,希望我能得到更多的答案。感谢您的贡献,但遗憾的是我们仍然无法捕捉到 window.postMessage 事件。奇怪的是我们可以捕获任何其他事件,例如 onClick。我们无法捕获具体是
window.postMessage(JSON.stringify(data), '*');。如果您有兴趣,我可以与您分享该网站的网址。再次感谢。我赞成你的回答。 -
@MFD3000,你解决了吗?我也遇到了这个。更改为
injectionTime: .atDocumentStart后我得到了它 -
@JannoTeelem:如果我使用
atDocumentStart,我的代码现在也可以工作。如果这个答案适用于 OP,那将会很有趣。 -
@MFD3000 我也遇到了类似的问题,你解决了吗?
标签: javascript ios swift native wkwebview