HarmonyOS鸿蒙Next中Arkweb的postMessage方法,发送给H5的data为什么origin字段是空的?
HarmonyOS鸿蒙Next中Arkweb的postMessage方法,发送给H5的data为什么origin字段是空的? Arkweb的postMessage方法,发送给H5的data为什么origin字段是空的?
H5页面没有对于应用发送的端口做存储使用的处理,因为场景只需要应用向H5单方向发送消息,但是H5收到的数据中origin为空
ArkWeb虽然基于谷歌Chromium内核开发。但是把postMessage又包装了下,估计把origin处理了。 好像只提供了这一个postMessage API,没有找到其他重载。 postMessage有三个参数,所以有三个可操作方式。目前看来只能在第一个name参数做文章了。



更多关于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 中,postMessage 的 origin 字段为空,通常是因为 Web 页面的源无法被识别(例如使用 file:// 协议加载本地页面,或未设置 allowUniversalAccessFromFileURLs 等权限)。也可能是在调用 postMessage 时未显式传递 targetOrigin 参数或传入了 "*",此时部分实现不会填充 origin。检查页面的加载协议和 WebView 的安全配置即可定位。
在ArkWeb中,应用通过postMessage向H5页面发送数据时,H5端收到的MessageEvent对象中origin字段为空字符串,这属于已知的系统行为。原因是该消息并非由同源页面的window.postMessage发起,而是来自原生应用侧,ArkWeb内部并未为该类消息强制填充来源标识。H5若需区分消息来源,建议在传递的data对象中增加自定义协议字段(如source: "app"),避免依赖origin进行判断。

