uniapp webview嵌入外部h5网页后的消息通知

    最近开发了个oa系统,pc端的表单使用form-create开发,form-create 是一个可以通过 JSON 生成具有动态渲染、数据收集、验证和提交功能的表单生成组件。移动端使用uniapp开发,但是因为form-create移动端只支持vant,不支持uniapp。官方的说法是移动端用vant开发后通过webview的方式嵌入到uniapp。

    uniapp嵌入开发好的h5页面没有问题,但是h5页面需要保存表单数据和发起工作流,做完这个操作后需要告知uniapp关闭webview页面,并跳转uniapp相应页面。

  (1)uniapp 的webview.vue页面:

<template>
	<view>
		<web-view :src="fileUrl" @message="handlerMessage"></web-view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				fileUrl: "",
			}
		},
		onLoad(options) {
			this.fileUrl = decodeURIComponent(options.fileUrl)
		},
		methods: {
			handlerMessage(event) {
				console.log('Received message:', event.detail.data);
			}
		}
	}
</script>

<style>

</style>

webview页面使用message方法监听h5发送给uniapp应用的消息。

(2)h5推送消息至uniapp

   我的h5页面基于vue3+vant4+vite开发。

   1.首先在public目录下新建static目录,接着创建js目录。下载jweixin-1.4.0.jsuni.webview.1.5.6.js文件到本地,引入到js目录下。

2.在项目index.html中写入如下内容:

<!DOCTYPE html>
<html lang="">
<head>
    <meta charset="UTF-8">
    <link rel="icon" href="/favicon.ico">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>流程表单</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
<script type="text/javascript" src="/static/js/jweixin-1.4.0.js"></script>
<script type="text/javascript" src="/static/js/uni.webview.1.5.6.js"></script>
<script>
    document.addEventListener('UniAppJSBridgeReady', function () {
        uni.getEnv(function (res) {
            if (res.plus) {
                console.log('当前环境为【5+App】');
            } else if (res.miniprogram) {
                console.log('当前环境为【微信小程序】');
            } else if (res.h5) {
                console.log('当前环境为h5');
            }
        });
    });
</script>
</body>
</html>

3.在h5页面,保存按钮点击时调用下面的方法。

//提交
async function onSubmit(formData) {
  let params = {
    procdefKey: processDefKey,
    formData: JSON.stringify(formData)
  };
  try {
    loading.value = true
    await apiSaveFormStartProcess(params);
    
    uni.postMessage({
      data: {
        action: 'startProcessCompleted'
      }
    });
    
    showSuccessToast('流程发起成功');
    uni.navigateBack({
      delta: 1
    });
  } finally {
    loading.value = false
  }
}

uni.postMessage推送消息到uniapp应用。由于message在后退、组件销毁、分享才会接受到消息。所以在提交完后,调用 uni.navigateBack触发后退。此时webview的message方法就能接受到消息了。

(3)效果

 

### 实现 UniAppWebViewH5 页面交互的方法 在 Vue.js 的 uni-app 开发环境中,为了实现混合模式下原生 AppWebview 加载的 H5 页面间的交互,开发者可以利用 `web-view` 组件以及特定 API 来完成数据传递和方法调用的功能[^1]。 #### 使用 web-view 组件加载外部 URL 并与其互动 当希望在一个页面中嵌入并显示来自网络或其他本地资源的内容时,可以通过 `<web-view>` 标签指定要访问的目标地址。对于想要同该视图内部 JavaScript 进行沟通的情况,则需借助于平台提供的接口函数来进行操作[^3]。 ```html <template> <view class="container"> <!-- 定义一个用于呈现远程HTML文档的空间 --> <web-view :src="url"></web-view> <!-- 添加按钮触发向WebView发送消息的动作 --> <button @click="sendMessageToWebView">Send Message</button> </view> </template> <script> export default { data() { return { url: 'https://example.com', // 设置目标网址 }; }, methods: { sendMessageToWebView() { const message = JSON.stringify({ action: "greet", payload: "Hello from UniApp!" }); // 调用API将字符串形式的消息传送给WebView中的JavaScript环境执行 plus.webview.currentWebview().evalJS(`handleMessage(${message})`); } } } </script> ``` 此代码片段展示了如何创建一个带有 `web-view` 插槽的应用界面,并定义了一个点击事件处理器用来构建一条信息并通过 `plus.webview.currentWebview().evalJS()` 发送到所关联的 HTML 文档里去处理[^2]。 #### 接收来自 WebView 的回调通知 为了让宿主应用程序能够响应由网页发起的操作请求,在实际项目里通常还需要设置监听器等待可能到来的通知或命令。这一步骤同样依赖于相应框架所提供的工具集来达成目的: ```javascript // 假设这是位于WebView内的脚本部分 function sendEventBack(eventType, eventData) { window.plus.android.invoke({ className: "io.dcloud.feature.uniapp.UniViewJsBridge", methodName: "sendData" }, eventType + ':' + encodeURIComponent(JSON.stringify(eventData))); } document.addEventListener('DOMContentLoaded', function () { console.log("Page loaded"); }, false); ``` 上述例子说明了怎样从被包含的网站端发出信号给承载它的容器——即这里的 UniApp 应用程序;而后者则可通过注册全局侦听机制捕获这些异步到达的信息流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值