在 Swift WKWebView 中捕获 window.postMessage

2023-11-26

我正在开发一个 swift ios 应用程序,它使用WKWebView加载电子商务网站。
当用户在这里购买产品时,结帐页面允许用户用加密货币付款。

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

我正在使用一个WKUserScript with 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 in 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)")
  }

对的,这是可能的。您还需要设置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 代码的命令末尾webView因为有些可以依赖标准的 javascript。

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

Note:我还建议webView作为类变量而不是方法变量,您可能正在创建它viewDidLoad(),我建议您将变量移至您的类中。

var webView: WKWebView!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Swift WKWebView 中捕获 window.postMessage 的相关文章

  • 光标:IE 8 和 9 中的自动行为

    我想要的是为整个正文标记指定cursor pointer 这样页面的背景是可点击的 但我也希望页面的其余部分像以前一样工作 所以我尝试为div设置cursor auto 其中包含这一页 在 FF Chrome 和 safari 中 它工作得
  • Express JS:请求的资源上不存在“Access-Control-Allow-Origin”标头

    我有一个在服务器上运行的 API 和一个连接到它以检索数据的前端客户端 我对跨域问题做了一些研究并使其发挥作用 但我不确定发生了什么变化 我现在在控制台中收到此错误 XMLHttpRequest 无法加载https api mydomain
  • 如何显示/隐藏jsf组件

    在我的一个 JSF 应用程序中 顶部的标题部分包含 selectOneMenu 底部的内容部分显示过滤器组件 默认情况下 应用程序首先在顶部显示 selectOneMenu 数据 在底部显示相应的 Filter 信息 如果用户选择不同的se
  • 获取输入图像类型选择的图片并加载到图像标签中

    所以 我有一个用于上传 img 文件的输入框 我想要做的是从该数据 或选定的源 中获取数据并将其路由到图像标签的 src 属性中 像这样的东西 http jsfiddle net QC2c4 http jsfiddle net QC2c4
  • 如何将OpenLayers多边形坐标转换为纬度和经度?

    我正在使用开放层 https openlayers org en latest examples draw freehand html绘制多边形并保存坐标的技术 这是我的代码 var raster new ol layer Tile sou
  • Lightbox:如何翻译“Image x of x”文本?

    我使用 Lightbox 2 作为图像集 当我的网站的访问者单击该集中的缩略图时 它将显示 图像的放大版本 下面是 描述 取自 a 标题属性 其下方 文本 Image x of x 例如 Image 1 of 12 有谁知道在哪里翻译 更改
  • Quickblox 聊天未进行身份验证

    我在我的应用程序中使用 Quickblox 进行一对一聊天 用户已经登录 但是当我尝试登录聊天时 出现以下错误 2014 03 31 12 42 09 532 MyChat 2175 3803 QBChat didNotAuthentica
  • Jquery Ajax 调用返回 403 状态

    我有一个 jquery Ajax 调用来实现会话的 keepalive 这个 keepAlive 方法将每 20 分钟调用一次 function keepAlive ajax type POST url KeepAliveDummy asp
  • 如何获取从 Express (Node.js) 中的表单传递的数据

    我想获取使用表单从页面传递的数据 并在重定向的页面中使用该数据 我的客户端有这个表格
  • Dojo“正在加载”消息

    我是 Dojo 新手 所以我需要一些帮助 我的一些链接需要一段时间 当用户单击时 页面开始加载需要几秒钟 我想添加一条 正在加载 消息 我可以用 旧时尚方式 来做 但我想学习新的 更简单 更智能的 Dojo 方式 具体如何工作现在并不重要
  • geocoder.geocodeAddressString 今天不再适用于快速更新

    https developer apple com library prerelease mac releasenotes General APIDiffsMacOSX10 11 Swift CoreLocation html https
  • 检测 html 选择框上的编程更改

    有没有办法让 HTML 选择元素在每次以编程方式更改其选择时调用函数 当使用 JavaScript 修改选择框中的当前选择时 IE 和 FF 都不会触发 onchange 此外 更改选择的 js 函数是框架的一部分 因此我无法更改它以在结束
  • javascript从字符串创建不区分大小写的正则表达式

    我试图通过以不区分大小写的方式将输入与正则表达式匹配来进行验证 正则表达式作为对象上的字符串从服务中下来 我可能会得到类似的东西 regex ane 我可以执行以下操作 var rx new RegExp object regex The
  • 奇怪的 Facebook ID [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有两个 Facebook 应用程序 它们都正在开发中 其中一个是很久以前创建的 而另一个则是相当新的 自从我升级到新的 iOS Faceb
  • 如何在 Safari 和 Native App 之间共享上下文?

    我有需要通过 Safari 设置一些上下文 上下文标记 然后从本机 iOS 应用程序读取该上下文 这样做的最佳实践是什么 到目前为止的一些想法 在 HTML 5 数据库中设置上下文 但我不确定这是否有效 因为该数据库可能只能从 Safari
  • 为什么 phantomjs 不能在 MacOS Sierra 中工作?

    我们正在使用phantomjs 1 9 1 macosx phantomjs 2 0 0 macosx哪一个工作得很好OS X 埃尔卡皮坦更新后macOS 塞拉利昂它会引发以下错误 phantomjs 1 9 1 macosx phanto
  • 文件和目录条目 API 在 Chrome 中损坏?

    我正在尝试使用文件和目录条目 API 创建一个文件上传器工具 该工具允许我将文件和目录的任意组合放入浏览器窗口中 以供读取和上传 我完全意识到 可以通过使用文件输入元素来实现类似的功能webkitdirectory已启用 但我正在测试一个用
  • 尽管 getBoundingClientRect() 是假的,但如何将事件坐标转换为 SVG 坐标?

    我正在尝试根据鼠标的位置在 SVG 元素上动态绘制内容 不幸的是 我很难将 mousemove 事件中的鼠标坐标转换为 SVG 元素的坐标空间 这是我一直在测试的一个有缺陷的函数 CylinderDemo prototype handleM
  • 用于替换前 5 个数字的正则表达式,无论它们之间有什么?

    我正在努力实现以下匹配 Input 123 45 6789 123456789 1234 正则表达式尝试输出 d 5 123 45 6789 123456789 1234 d 2 3 123 45 6789 123456789 1234 d
  • 加载谷歌地图控件时是否有事件?

    我知道tilesloaded 但控件似乎在该事件之后加载 我基本上希望能够通过 jQuery 获取控件 但甚至找不到正确的监听 我也刚刚处理了 没有类似的事件 在控件可见之前空闲和tilesloaded触发 因此 基本上将 特殊控制 类添加

随机推荐

  • Chrome 版本 102.0.5005.61 破坏了我的 CSS/HTML

    我有一个网站已经工作了很长时间 今天我的一位同事告诉我 更新到最新版本的 Chrome 后 该网站在几个地方出现了故障 我使用所使用的 html 和 css 创建了该问题的快速小样本 这个问题似乎与使用列有关 据我所知 box sizing
  • 如何使用 LINQ to SQL 执行 CROSS JOIN?

    如何使用 LINQ to SQL 执行 CROSS JOIN 交叉连接只是两个集合的笛卡尔积 没有明确的连接运算符 var combo from p in people from c in cars select new p Name c
  • 如何在 YAML 文件中使用变量?

    我有 YAML 文件 需要将变量作为输入 outputters type DateFileOutputter name logfile level DEBUG date pattern Y m d trunc false dirname h
  • 如何在空格而不是引号之间进行分割? [复制]

    这个问题在这里已经有答案了 我试图仅在空格上分割字符串 s 但不在 引用 部分之间 我通过以下方式匹配这些引用部分之间的所有文本 1 Regex101 但是 当我尝试将其添加为否定前瞻 仅在这些引号之外的空白处进行分割时 我无法让它工作 s
  • 如何向 aws sso 用户授予 eks 集群权限?

    我通过 IAM 用户部署了 EKS 集群 需要向其他 aws sso 用户授予完整的集群权限 我遵循了这个指示https docs aws amazon com eks latest userguide add user role html
  • 如何将 AudioFilePlayer AudioUnit 连接到 3DMixer?

    我正在尝试将 AudioFilePlayer AudioUnit 连接到 AU3DMixerEmbedded 音频单元 但没有成功 这就是我正在做的 创建一个AUGraph with NewAUGraph 打开图表 初始化图表 添加3个节点
  • iOS 14 SwiftUI 键盘自动抬起视图

    我在视图中使用 TextField 当它成为第一响应者时 它会离开视图 如下面的 GIF 所示 有什么办法可以摆脱这种行为吗 这是我的代码 NavigationView content ZStack MyTabView selectedIn
  • Safari 上的 HTML5 音频标签有延迟

    我正在尝试使用 html 标签来完成一个简单的类似涂鸦的行为 其中点击时会响起 mp3 ogg 声音 它应该可以在 Firefox Safari 和 iPad Safari 下运行 这是非常理想的 我尝试了很多方法 最终得出以下结论 HTM
  • Google Calendar Api,会议室可用吗?

    如何列出特定日期时间的特定日历资源 房间 的可用性 就像如果我想列出会议室的所有今天活动 跨今天预订会议室的所有用户帐户活动 哪个谷歌日历 api 调用可以给我这个 我从 Google 日历资源 api 获取房间详细信息 但无法获取不同帐户
  • 是否需要“do {...} while ( )”循环?

    Bjarne Stroustrup C 创建者 曾经说过 他避免使用 do while 循环 而更喜欢用 while 循环来编写代码 参见下面的引用 自从听到这件事后 我发现这是真的 你怎么看 有没有一个例子 其中 do while 比使用
  • Socket.IO:XHR 轮询断开连接延迟

    我正在使用 socket io 和 node js 我在跟踪哪些用户在线时遇到问题 因为套接字 IO 识别 XHR 轮询客户端已断开连接之前有几秒钟的延迟 如果 XHR 轮询客户端刷新页面 他们的新连接消息似乎先于断开连接消息 当尝试跟踪哪
  • 如何使用open id作为登录系统

    我想尝试在我要创建的网站上使用开放 ID 作为登录系统 我已经查看了这个网站 但我不太确定这一切是如何运作的以及如何使其发挥作用 http remysharp com 2007 12 21 how to integrate openid a
  • 使用 SonarQube 5.2 构建 Breaker 插件

    似乎是构建断路器插件不再与 SonarQube 5 2 兼容 如果声纳门未满足 是否有任何替代方案可以避免 VSO 构建失败 或者是否计划将 Build Breaker 插件更新到 5 2 目前 没有任何插件会在质量门未通过时破坏构建声纳Q
  • 如何获取菜单项的操作视图?

    这是我的代码 home xml
  • 可以选择在 Angular 4 中应用 http 拦截器

    以下 url 解释了如何在 Angular 4 中使用 http 拦截器 https angular io guide http intercepting all requests or responses 但是 我想知道是否有什么方法可以
  • 使用 Microsoft Graph API 创建“作为在线会议的活动”或仅创建在线会议

    任何在特定租户下登录我们系统 IdentityServer 作为身份验证 的用户都应该能够创建在线会议 MS Teams 活动 我们跟随使用 Microsoft Graph 构建 ASP NET Core MVC 应用程序 and 创建并启
  • 使用mockito模拟构造函数

    我想将构造函数模拟为方法 public String generaID GeneraIDParaEntidadCliente aux new GeneraIDParaEntidadCliente nombre registro entida
  • 将 seeds.rb 分成多个部分?

    我想将 seeds rb 文件分成多个部分以便于维护 将所有 A 种子放入 a rb 中 将 B 种子放入 b rb 中 等等 单独的文件位于 db 目录中 包含 seeds rb 每个文件都包含一堆 A create 或 B create
  • 如何从频繁访问的表中删除多行

    我需要删除一个非常大的表 例如 500 万行 的大部分 例如 90 该表的另外 10 被频繁读取 但不被写入 From 按 ID 删除数百万行的最佳方法 我认为我应该删除要删除的 90 上的所有索引 以加快该过程 除了我用来选择要删除的行的
  • 在 Swift WKWebView 中捕获 window.postMessage

    我正在开发一个 swift ios 应用程序 它使用WKWebView加载电子商务网站 当用户在这里购买产品时 结帐页面允许用户用加密货币付款 当用户点击 在钱包中打开 时 网站会弹出一个 window postMessage paymen