HarmonyOS鸿蒙Next中Arkweb的postMessage方法,发送给H5的data为什么origin字段是空的?

HarmonyOS鸿蒙Next中Arkweb的postMessage方法,发送给H5的data为什么origin字段是空的? Arkweb的postMessage方法,发送给H5的data为什么origin字段是空的?

H5页面没有对于应用发送的端口做存储使用的处理,因为场景只需要应用向H5单方向发送消息,但是H5收到的数据中origin为空

8 回复

ArkWeb虽然基于谷歌Chromium内核开发。但是把postMessage又包装了下,估计把origin处理了。 好像只提供了这一个postMessage API,没有找到其他重载。 postMessage有三个参数,所以有三个可操作方式。目前看来只能在第一个name参数做文章了。

cke_18366.png

cke_9012.png

cke_923.png

更多关于HarmonyOS鸿蒙Next中Arkweb的postMessage方法,发送给H5的data为什么origin字段是空的?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


Origin请求头指示了引发该请求的源(协议、主机名和端口号),是从网页A打开网页B时,网页B获取到的Origin就是网页A的信息,由于你是在原生页面调用Arkweb的postMessage方法,而原生页面并非网页,所以不存在Orgin,自然也获取不到。

ArkWeb中通过 file:// 协议加载本地HTML时,浏览器安全策略会将 event.origin 固定设为字符串 “null” (非空值),这是W3C规范要求,防止本地文件访问时泄露敏感信息。H5接收到的 postMessage 事件中 origin 显示为 “null” 属正常行为,并非字段为空。若需明确来源,应改用HTTP(S)协议部署页面,或在H5端主动校验 event.origin === “null” 后处理逻辑 。

官方示例(包括端口通信示例)里,H5 侧也没有依赖 event.origin,只依赖 data 和 ports的。业务上你忽略 origin 即可。就算你非要传信息的话也可以直接在data里面加啊

this.controller.postMessage(
  JSON.stringify({ source: 'my_app', payload: 'your_data' }),
  '*'
);

这个其实是 ArkWeb 当前实现机制导致的,不一定是你代码有问题。

你这里:

postMessage(data)

发送给 H5 后,

H5 收到的:

event.origin

为空,

一般是因为:

ArkWeb 的 postMessage 并不是标准浏览器 Window.postMessage 的完整实现。

它更偏向:

“ArkWeb ↔ H5 通信桥”

而不是严格 Web 标准的跨域消息机制。

正常浏览器里:

window.postMessage(data, origin)

origin 会自动带:

https://xxx.com

因为消息来源是浏览器页面。

但 ArkWeb 里:

应用侧并没有真正的“网页 origin”。

所以:

event.origin === ""

或者:

null

属于常见情况。

尤其你这个场景:

“应用 → H5 单向通信”

没有建立 MessagePort 通道,

只是简单 postMessage,

很多情况下:

  • source
  • ports
  • origin

都不会完整。

这也是为什么官方很多 ArkWeb 示例里:

实际上都不依赖:

event.origin

而是:

直接判断 message 内容。

例如:

window.addEventListener('message', (event) => {
  console.log(event.data)
})

而不是:

event.origin

所以你现在这个现象:

“H5 收到 data,但 origin 为空”

大概率属于 ArkWeb 当前行为,不算异常。

如果业务上确实需要“来源校验”,建议:

应用侧自己带来源字段。

例如:

ArkTS:

controller.postMessage({
  from: 'harmony_app',
  type: 'login',
  data: xxx
})

H5:

window.addEventListener('message', (event) => {
  if (event.data.from === 'harmony_app') {
    <em>// 可信消息</em>
  }
})

不要依赖:

event.origin

去做鉴权。

另外还有一个点:

如果 H5 是:

file://

或者本地资源页,

origin 本身也可能为空。

只有:

https://
http://

页面,

标准浏览器里才会有明确 origin。

一句话总结:

ArkWeb 的 postMessage 不是完整浏览器 postMessage 实现,origin 为空属于常见情况。HarmonyOS 场景里建议业务自己在 data 中携带来源标识,不要依赖 event.origin。

这个现象更像是 WebMessagePort 通道的语义差异,不建议把 H5 侧收到的 event.origin 当作这类消息的可信来源判断。

ArkWeb 的 postMessage/MessagePort 示例里,应用侧先通过 WebviewController.postMessage 把端口传给 H5,后续通过 WebMessagePort.postMessageEvent 或 postMessageEventExt 发送业务数据;H5 侧主要读取 event.data。端口消息不是由某个网页窗口主动调用 window.postMessage 产生的跨源消息,所以 origin 可能为空或不具备你预期的页面 URL 语义。

如果业务只需要 ArkTS 单向通知 H5,建议在 data 里自带 source、version、requestId 等字段,或初始化端口时做一次握手保存端口引用;安全判断不要依赖空的 origin 字段。

在 ArkWeb 中,postMessageorigin 字段为空,通常是因为 Web 页面的源无法被识别(例如使用 file:// 协议加载本地页面,或未设置 allowUniversalAccessFromFileURLs 等权限)。也可能是在调用 postMessage 时未显式传递 targetOrigin 参数或传入了 "*",此时部分实现不会填充 origin。检查页面的加载协议和 WebView 的安全配置即可定位。

在ArkWeb中,应用通过postMessage向H5页面发送数据时,H5端收到的MessageEvent对象中origin字段为空字符串,这属于已知的系统行为。原因是该消息并非由同源页面的window.postMessage发起,而是来自原生应用侧,ArkWeb内部并未为该类消息强制填充来源标识。H5若需区分消息来源,建议在传递的data对象中增加自定义协议字段(如source: "app"),避免依赖origin进行判断。

回到顶部