uniapp 与H5通信实操

在App开发中,经常需要在app内嵌入H5页面并实现两者之间的通信。通过WebView组件,可以监听message事件来接收H5通过postMessage发送的信息。H5端需要引入uni.webview.js库,并在合适时机调用postMessage方法传递数据。通过在main.js中注册全局变量,可以简化uni-app中对uni对象的调用,便于后续编码工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在app项目中,经常会遇到app 嵌套H5页面的需求,进而app与H5之间需要进行通信。

在app中是通过webview来实现,app中与H5交互的页面中html中代码如下:

<web-view :src="webviewSrc" :webview-styles="webviewStyles" @message='getMessage'></web-view>

通过绑定message方法来接收H5发送给App的信息

getMessage(mes){
	console.log('-------message-----:',JSON.stringify(mes))
}

在相应的H5页面通过postMessage来发送信息

document.addEventListener("UniAppJSBridgeReady", function() {
	uni.postMessage({
		data: {
			action: 'H5来了'
		},
	})
});

但是需要做一些准备公共,首先,要在相应的H5包中引入uni.webview.1.5.4,此处只说通过引入该js文件的方式引入。下载该js文件,放在项目中,在main.js文件中引入该js文件即可

import * as uni from './js_sdk/uni.webview.1.5.4.js'  

为了方便使用,可以在引入之后注册全局变量

document.addEventListener("UniAppJSBridgeReady", function() {  
    Vue.prototype.myUni = uni  
});

后续使用的时候会简化代码

this.myUni.webView.postMessage({
					data: {
					  action: 'H5来了'
					},  
				});

实现通信之后,我们就可以进行其他的编码工作了

<think>好的,我现在需要回答用户关于UniApp小程序如何H5页面进行通信的问题。用户还希望有方法示例。首先,我得回忆一下UniApp的文档和相关技术点。 根据用户提供的引用,UniAppH5通信主要有两种方式:UniAppH5发送数据,以及H5UniApp发送消息。我记得UniApp使用WebView组件加载H5页面,而通信通常依赖于JavaScript的API。比如,UniApp可以通过WebView的API向H5传递数据,而H5可以通过uni.postMessage方法发送消息到UniApp。 接下来,我需要考虑具体的实现步骤。首先,UniAppH5发送数据可能是在WebView加载时通过URL参数传递,或者在加载完成后通过evalJS执行JavaScript代码。例如,在onReady事件中调用evalJS来修改H5页面的全局变量。这需要确保WebView已经加载完毕,否则evalJS可能不生效。 然后是H5UniApp发送消息。H5页面可以通过uni的SDK调用postMessage,而UniApp端需要监听@message事件来处理接收到的数据。需要注意的是,H5页面必须引入uni-webview-js库,否则无法使用uni.postMessage方法。这一点很重要,用户可能会忽略导致通信失败。 用户可能遇到的常见问题包括:通信方法不生效,可能是因为没有正确引入库,或者事件监听没有正确绑定。例如,在UniApp的WebView组件中,必须添加@message监听器,而H5页面需要引入uni-webview-js的脚本。此外,跨域问题也可能影响通信,但通常在WebView中同源策略较为宽松,不过仍需注意。 另外,引用中提到的H5返回App页面时可能需要通信,这时候可能需要通过H5发送消息触发UniApp的路由跳转。比如,在H5的表单提交成功后,调用uni.postMessage通知UniApp跳转到指定页面。 在写示例代码时,需要确保UniApp的template部分有正确的WebView标签,并绑定load事件和message事件。H5页面的示例代码要展示如何引入uni-webview-js,并调用postMessage方法。同时,要提醒用户注意生命周期的问题,比如在WebView的onReady后再调用evalJS。 最后,应该总结一下步骤,强调关键点,比如引入库、事件监听、数据格式等。可能还需要提到调试方法,比如在H5中使用console.log检查是否成功发送消息,或者在UniApp中打印接收到的数据来排查问题。</think>### UniApp小程序H5页面通信方法及示例 UniApp通过`<web-view>`组件加载H5页面时,可通过以下两种方式实现双向通信: #### 一、UniAppH5发送数据 1. **URL参数传递** 在加载H5页面时直接通过URL传参: ```html <web-view :src="`https://h5-domain.com/page.html?token=${token}``"></web-view> ``` H5页面通过`window.location.search`解析参数[^1]。 2. **evalJS方法注入** 通过WebView组件的`evalJS`执行H5页面的JavaScript代码: ```html <web-view ref="webview" @onPostMessage="handleH5Message" @load="onWebViewLoad"></web-view> ``` ```javascript onWebViewLoad() { this.$refs.webview.evalJS(`window.setUniAppData('${JSON.stringify(data)}')`); } ``` #### 二、H5UniApp发送数据 1. **uni.postMessage API** H5页面引入`uni-webview-js`库后调用: ```html <script src="https://gitee.com/dcloud/uni-webview-js/raw/master/dist/uni.webview.1.5.4.js"></script> <script> uni.postMessage({ action: 'submit', data: { status: 'success' } }); </script> ``` UniApp监听`@message`事件接收数据: ```javascript handleH5Message(event) { const message = event.detail.data[0]; if (message.action === 'submit') { uni.navigateBack({ delta: 1 }); // 根据H5指令控制路由 } } ``` #### 完整示例 **UniApp端代码**: ```html <template> <web-view src="/hybrid/html/index.html" @message="handleH5Message" @load="onWebViewReady" ></web-view> </template> <script> export default { methods: { onWebViewReady() { // 向H5注入初始化数据 this.$refs.webview.evalJS(`window.uniAppToken = 'UNIAPP_123'`); }, handleH5Message(e) { const msg = e.detail.data[0]; if (msg.type === 'route') { uni.switchTab({ url: msg.target }); } } } } </script> ``` **H5页面代码**: ```html <!DOCTYPE html> <html> <head> <script src="https://gitee.com/dcloud/uni-webview-js/raw/master/dist/uni.webview.1.5.4.js"></script> </head> <body> <button onclick="sendToUniApp()">返回首页</button> <script> function sendToUniApp() { uni.postMessage({ type: 'route', target: '/pages/home/index' }); } </script> </body> </html> ``` #### 注意事项 1. **安全校验**:建议对H5发送的消息进行来源验证 2. **生命周期**:需等待WebView加载完成(`@load`事件触发后)再调用`evalJS` 3. **数据格式**:通信数据需为可序列化的JSON对象[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值