uni-app实现web-view和App之间的相互通信

双向实时

如果app端部署成网站,则web-view就是iframe,使用也可以双向通讯

https://uniapp.dcloud.net.cn/component/web-view.html

APP端代码

index.vue:

<template><web-viewid="m-webview":fullscreen="true":src="webViewSrc":webview-styles="{ height: '400px' }"@message="handleMessage"@onPostMessage="handlePostMessge"@load="handleLoad"@error="handleError"></web-view>
</template><script lang="ts" setup>
import { ref } from 'vue'
import { onLoad } from '@dcloudio/uni-app'let webViewSrc = ref('')
let webview: any
//#region 事件
const handleH5Message = (value: any) => {console.log('父应用接收消息,handleH5Message', value.data.data)handleH5PostMessage()
}const handleMessage = (value: any) => {console.log('父应用接收消息,handleMessage', value)webview.evalJS('globalCallbackForApp("点击")')if (Array.isArray(value.detail?.data) && value.detail.data.length > 0) {if (value.detail.data[0].type === 'msg' &&value.detail.data[0].value === 'chooseImage') {if (value.detail.data[0].callback) {webview.evalJS(`${value.detail.data[0].callback}("自定义点击")`)}uni.chooseImage({count: 1, // 默认9, 设置图片的选择数量sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有sourceType: ['album'], // 从相册选择success: (res) => {// 返回选定照片的本地文件路径列表 tempFilePathsconsole.log(res.tempFilePaths)},fail: (err) => {// 处理错误console.error(err)},})}}
}const handlePostMessge = (value: any) => {console.log('handlePostMessge', value)
}const handleLoad = (value: any) => {console.log('handleLoad', value)
}const handleError = (value: any) => {console.log('handleError', value)
}//#endregionconst handleMessageInit = () => {// #ifdef H5window.removeEventListener('message', handleH5Message)window.addEventListener('message', handleH5Message)// #endif
}const handleH5PostMessage = () => {var iframe: any = document.getElementById('m-webview')var message = {target: 'iframe',data: 'Hello, I am your parent',}console.log('父应用发送消息', message)iframe.contentWindow.postMessage(message, '*')
}const init = (option: any) => {handleMessageInit()webViewSrc.value = option.webViewUrl// #ifdef APP-PLUS//https://uniapp.dcloud.net.cn/tutorial/page.html#getappwebviewlet pages = getCurrentPages()let page: any = pages[pages.length - 1]let currentWebview = page.$getAppWebview()setTimeout(() => {webview = currentWebview.children()[0]console.log('this.wvNode.evalJS2', typeof webview.evalJS)if (typeof webview.evalJS === 'function') {console.log('执行')webview.evalJS('globalCallbackForApp("初始化")')}}, 1000)// #endif
}onLoad((option) => {init(option)
})
</script><style lang="scss" scoped></style>

被嵌入的网页端代码

list-user.vue:

<template><view><view class="m-title">工艺报警</view><text>{{ title }}</text><view class="m-btn-wrap"><cl-button @click="handleClick">打开相册</cl-button></view></view>
</template><script setup lang="ts">
import { ref } from "vue";
import { onLoad } from "@dcloudio/uni-app";const title = ref("");//#region 事件
const handleFormatPostMessageData = (value: any) => {if (typeof value.callbackFun === "function") {window[value.callback] = value.callbackFun;delete value.callbackFun}return {...value,};
};const handleClick = () => {console.log("子应用发送消息");webViewUni.postMessage({data: handleFormatPostMessageData({type: "msg",value: "chooseImage",callback: "customCallbackClick",callbackFun: (data: any) => {console.log("子应用接收父应用的实时消息【自定义】:", data);},}),});
};//#endregionconst init = () => {window.addEventListener("message",function (event) {if (event.data.target === "iframe") {console.log("子应用接收消息:", event.data.data);}},false,);
};onLoad(() => {init();
});
</script><style lang="scss" scoped>
.m-title {padding: 20rpx;color: #666;font-size: 40rpx;
}
.m-btn-wrap {padding: 20rpx;
}
</style>

hybrid_html_uni.webview.1.5.5.js:

!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e=e||self).uni=n()}(this,(function(){"use strict";try{var e={};Object.defineProperty(e,"passive",{get:function(){!0}}),window.addEventListener("test-passive",null,e)}catch(e){}var n=Object.prototype.hasOwnProperty;function i(e,i){return n.call(e,i)}var t=[];function o(){return window.__dcloud_weex_postMessage||window.__dcloud_weex_}function a(){return window.__uniapp_x_postMessage||window.__uniapp_x_}var r=function(e,n){var i={options:{timestamp:+new Date},name:e,arg:n};if(a()){if("postMessage"===e){var r={data:n};return window.__uniapp_x_postMessage?window.__uniapp_x_postMessage(r):window.__uniapp_x_.postMessage(JSON.stringify(r))}var d={type:"WEB_INVOKE_APPSERVICE",args:{data:i,webviewIds:t}};window.__uniapp_x_postMessage?window.__uniapp_x_postMessageToService(d):window.__uniapp_x_.postMessageToService(JSON.stringify(d))}else if(o()){if("postMessage"===e){var s={data:[n]};return window.__dcloud_weex_postMessage?window.__dcloud_weex_postMessage(s):window.__dcloud_weex_.postMessage(JSON.stringify(s))}var w={type:"WEB_INVOKE_APPSERVICE",args:{data:i,webviewIds:t}};window.__dcloud_weex_postMessage?window.__dcloud_weex_postMessageToService(w):window.__dcloud_weex_.postMessageToService(JSON.stringify(w))}else{if(!window.plus)return window.parent.postMessage({type:"WEB_INVOKE_APPSERVICE",data:i,pageId:""},"*");if(0===t.length){var u=plus.webview.currentWebview();if(!u)throw new Error("plus.webview.currentWebview() is undefined");var g=u.parent(),v="";v=g?g.id:u.id,t.push(v)}if(plus.webview.getWebviewById("__uniapp__service"))plus.webview.postMessageToUniNView({type:"WEB_INVOKE_APPSERVICE",args:{data:i,webviewIds:t}},"__uniapp__service");else{var c=JSON.stringify(i);plus.webview.getLaunchWebview().evalJS('UniPlusBridge.subscribeHandler("'.concat("WEB_INVOKE_APPSERVICE",'",').concat(c,",").concat(JSON.stringify(t),");"))}}},d={navigateTo:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;r("navigateTo",{url:encodeURI(n)})},navigateBack:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.delta;r("navigateBack",{delta:parseInt(n)||1})},switchTab:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;r("switchTab",{url:encodeURI(n)})},reLaunch:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;r("reLaunch",{url:encodeURI(n)})},redirectTo:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;r("redirectTo",{url:encodeURI(n)})},getEnv:function(e){a()?e({uvue:!0}):o()?e({nvue:!0}):window.plus?e({plus:!0}):e({h5:!0})},postMessage:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};r("postMessage",e.data||{})}},s=/uni-app/i.test(navigator.userAgent),w=/Html5Plus/i.test(navigator.userAgent),u=/complete|loaded|interactive/;var g=window.my&&navigator.userAgent.indexOf(["t","n","e","i","l","C","y","a","p","i","l","A"].reverse().join(""))>-1;var v=window.swan&&window.swan.webView&&/swan/i.test(navigator.userAgent);var c=window.qq&&window.qq.miniProgram&&/QQ/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);var p=window.tt&&window.tt.miniProgram&&/toutiaomicroapp/i.test(navigator.userAgent);var _=window.wx&&window.wx.miniProgram&&/micromessenger/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);var m=window.qa&&/quickapp/i.test(navigator.userAgent);var f=window.ks&&window.ks.miniProgram&&/micromessenger/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);var l=window.tt&&window.tt.miniProgram&&/Lark|Feishu/i.test(navigator.userAgent);var E=window.jd&&window.jd.miniProgram&&/micromessenger/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);var x=window.xhs&&window.xhs.miniProgram&&/xhsminiapp/i.test(navigator.userAgent);for(var S,h=function(){window.UniAppJSBridge=!0,document.dispatchEvent(new CustomEvent("UniAppJSBridgeReady",{bubbles:!0,cancelable:!0}))},y=[function(e){if(s||w)return window.__uniapp_x_postMessage||window.__uniapp_x_||window.__dcloud_weex_postMessage||window.__dcloud_weex_?document.addEventListener("DOMContentLoaded",e):window.plus&&u.test(document.readyState)?setTimeout(e,0):document.addEventListener("plusready",e),d},function(e){if(_)return window.WeixinJSBridge&&window.WeixinJSBridge.invoke?setTimeout(e,0):document.addEventListener("WeixinJSBridgeReady",e),window.wx.miniProgram},function(e){if(c)return window.QQJSBridge&&window.QQJSBridge.invoke?setTimeout(e,0):document.addEventListener("QQJSBridgeReady",e),window.qq.miniProgram},function(e){if(g){document.addEventListener("DOMContentLoaded",e);var n=window.my;return{navigateTo:n.navigateTo,navigateBack:n.navigateBack,switchTab:n.switchTab,reLaunch:n.reLaunch,redirectTo:n.redirectTo,postMessage:n.postMessage,getEnv:n.getEnv}}},function(e){if(v)return document.addEventListener("DOMContentLoaded",e),window.swan.webView},function(e){if(p)return document.addEventListener("DOMContentLoaded",e),window.tt.miniProgram},function(e){if(m){window.QaJSBridge&&window.QaJSBridge.invoke?setTimeout(e,0):document.addEventListener("QaJSBridgeReady",e);var n=window.qa;return{navigateTo:n.navigateTo,navigateBack:n.navigateBack,switchTab:n.switchTab,reLaunch:n.reLaunch,redirectTo:n.redirectTo,postMessage:n.postMessage,getEnv:n.getEnv}}},function(e){if(f)return window.WeixinJSBridge&&window.WeixinJSBridge.invoke?setTimeout(e,0):document.addEventListener("WeixinJSBridgeReady",e),window.ks.miniProgram},function(e){if(l)return document.addEventListener("DOMContentLoaded",e),window.tt.miniProgram},function(e){if(E)return window.JDJSBridgeReady&&window.JDJSBridgeReady.invoke?setTimeout(e,0):document.addEventListener("JDJSBridgeReady",e),window.jd.miniProgram},function(e){if(x)return window.xhs.miniProgram},function(e){return document.addEventListener("DOMContentLoaded",e),d}],M=0;M<y.length&&!(S=y[M](h));M++);S||(S={});var P="undefined"!=typeof uni?uni:{};if(!P.navigateTo)for(var b in S)i(S,b)&&(P[b]=S[b]);return P.webView=S,P}));

index.html

<!doctype html>
<html><head><meta charset="UTF-8" /><script>window.globalCallbackForApp = function (value) {console.log("子应用接收父应用的实时消息【全局】", value);};var coverSupport ="CSS" in window &&typeof CSS.supports === "function" &&(CSS.supports("top: env(a)") || CSS.supports("top: constant(a)"));document.write('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +(coverSupport ? ", viewport-fit=cover" : "") +'" />',);</script><script src="/src/static//js/hybrid_html_uni.webview.1.5.5.js"></script><!-- <script type="text/javascript" src="https://api.map.baidu.com/api?v=1.0&type=webgl&ak=PB3X34j5vGW07DLETDN11qtTrrV1fn8M"></script> --><script type="text/javascript">window.webViewUni = uni;// 待触发 `UniAppJSBridgeReady` 事件后,即可调用 uni 的 API。document.addEventListener("UniAppJSBridgeReady", function () {// webViewUni.postMessage({// 	data: {// 		action: "message",// 	},// });// webViewUni.getEnv(function (res) {// 	console.log("当前环境:" + JSON.stringify(res));// });});</script><title></title><!--preload-links--><!--app-context--></head><body><div id="app"><!--app-html--></div><script type="module" src="/src/main.ts"></script></body>
</html>

APP端代码(选项式)

<template><web-viewref="webview"src="http://11.2.244.245:9901/pages/home/list-user/index":fullscreen="false"id="m-webview"></web-view>
</template><script lang="ts">
export default {data() {return {webUrl: '',wvNode: null,}},onReady() {// #ifdef APP-PLUSvar currentWebview = this.$scope.$getAppWebview() //此对象相当于html5plus里的plus.webview.currentWebview()。在uni-app里vue页面直接使用plus.webview.currentWebview()无效setTimeout(() => {this.wvNode = currentWebview.children()[0]console.log('currentWebview', currentWebview)console.log('this.wvNode.evalJS1', this.wvNode)console.log('this.wvNode.evalJS', typeof this.wvNode.evalJS)console.log('执行')this.wvNode.evalJS('msgFromApp("来着父组件的消息")')}, 1000)// #endif},onHide() {// console.log('patrol-h5-onHide')// #ifdef APP-PLUSconst name = 'stop'this.wvNode.evalJS("msgFromApp('" + name + "')")// console.log('---currentWebview---wvNode---onHide=',this.wvNode.evalJS)// #endif},
}
</script><style lang="scss" scoped></style>

https://uniapp.dcloud.net.cn/tutorial/page.html#getappwebview

参考链接

https://juejin.cn/post/7230727650259025980

人工智能学习网站 

https://chat.xutongbao.top

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/422010.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python-确定进制

题目描述 6 942 对于十进制来说是错误的&#xff0c;但是对于 13 进制来说是正确的。即 6(13)​ 9(13)​42(13)​&#xff0c;而 42(13)​4 13^12 13^054(10)​。 你的任务是写一段程序读入三个整数 p,q 和 r&#xff0c;然后确定一个进制 B(2≤B≤16) 使得 p qr 。如果 B 有…

CMS之Wordpress建设

下载 https://cn.wordpress.org/ 宝塔安装Wordpress 创建网站 上传文件、并解压、剪切文件到项目根目录 安装 -> 数据库信息 -> 标题信息 http://wordpress.xxxxx.com 登录 http://wordpress.xxxxxxxxx.com/wp-admin/ 1. 主题(模板) wordpress-基本使用-02-在主题…

VLAN配置学习笔记

1、VLAN的基础配置命令 &#xff08;1&#xff09;创建VLAN [Huawei] vlan vlan-id 通过此命令创建VLAN并进入VLAN视图&#xff0c;如果VLAN已存在&#xff0c;直接进入该VLAN的视图。 vlan-id是整数形式&#xff0c;取值范围是1&#xff5e;4094。 [Huawei] vlan batch {…

docker管理redis集群

1.拉取redis镜像 docker pull redis拉取完成 [rootlocalhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE redis latest a617c1c92774 3 years ago 105MB2.运行redis容器 docker run -itd --name redis-test01 -p 6379:6379…

Apache OFBiz 远程代码执行漏洞复现(CVE-2024-45195)并拿到shell

FOFA&#xff1a;app"Apache_OFBiz" 复现&#xff1a; VPS上准备两个文件 rceschema.xml <data-files xsi:noNamespaceSchemaLocation"http://ofbiz.apache.org/dtds/datafiles.xsd" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"…

c++基类和派生类对象的赋值转换——赋值兼容规则

1.引出 如下场景&#xff1a; 由于b是double类型&#xff0c;所以赋值给int类型的引用前&#xff0c;要先进行隐式类型转换&#xff0c;这中间会生成临时对象&#xff0c;类是对象具有常性&#xff0c;所以int&之前应该加上const。 但是下面的场景&#xff1a; 没有出现报…

Qt进程通信,不推荐使用QSharedMemory和QLocalSocket,而是推荐ZMQ

一、据一位资深的网友说QLocalSocket有问题&#xff0c;共享内存QSharedMemory也有&#xff0c;比如存在多线程问题&#xff0c;不灵活&#xff0c;丢数据等问题都有&#xff0c;而且还占资源。血的教训。后来换成了zmqprotobuf。ZMQ进程内&#xff0c;进程间&#xff0c;机器间…

电脑文件怎么加密?文件加密方法介绍

随着数字化时代的到来&#xff0c;电脑文件的安全性问题日益凸显。为了保护个人隐私和企业数据&#xff0c;文件加密成为了一项重要的安全措施。本文将详细介绍几种常见的电脑文件加密方法&#xff0c;帮助你更好地保护自己的数据安全。 超级加密3000 超级加密3000提供了两种主…

F110批量付款如何Debug BTE增强(后台JOB的调试方法)

F110批量付款如何Debug BTE增强&#xff08;后台JOB的调试方法&#xff09; SAP系统中的F110&#xff08;Automatic Payment&#xff09;是一个常用的付款程序&#xff0c;在实施过程中&#xff0c;也经常会遇到一些运行的错误&#xff0c;而对于此类的错误&#xff0c;通常的…

网络分析仪仪器校准要怎么进行检测?容易出现哪些误差?

当我们使用矢量网络分析仪时&#xff0c;会发现测量数据存在误差。要纠正它&#xff0c;首先要知道矢量网络分析仪的误差来源是什么。 主要有三个方面:漂移误差、随机误差、系统误差。 一、 漂移误差:是由于仪器或测试系统仪器校准之后性能发生变化引起的&#xff0c;主要是温…

uni-app和Node.js使用uni-push2.0实现通知栏消息推送功能

前言 uniapp 提供了 unipush 统一推送服务,但是每次要推送消息的时候都要登陆 Dcloud 开发者后台&#xff0c;有点不方便&#xff0c;运营需要在我们的后台系统就可以完成操作。 效果演示 消息下发流程 名词解释 名词解释通知消息指定通知标题和内容后&#xff0c;由个推 SD…

【STM32】OLED

OLED显示原理 OLED使用的是I2C协议&#xff0c;使用ssd1306芯片对所有灯进行控制&#xff0c;如果一个灯需要一个引脚的话&#xff0c;屏幕分为8页&#xff0c;每页有128列&#xff0c;8行 . 共有128* 88个灯 这样引脚是算不过来的&#xff0c;所以我们使用了ssd1306芯片&…

【深度学习】【图像分类】【OnnxRuntime】【C++】ResNet模型部署

【深度学习】【图像分类】【OnnxRuntime】【C】ResNet模型部署 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【图像分类】【OnnxRuntime】【C】ResNet模型部署前言模型转换--pytorch转onnxWindows平台搭建依赖环境ONNXRuntime推…

搜索功能技术方案

1. 背景与需求分析 门户平台需要实现对服务信息的高效查询&#xff0c;包括通过关键字搜索服务以及基于地理位置进行服务搜索。面对未来可能的数据增长和性能需求&#xff0c;选择使用 Elasticsearch 来替代 MySQL 的全文检索功能。这一选择的背景与需求可以总结为以下几点&am…

maven简介

1&#xff0c; 结构化管理项目 如果不用maven&#xff0c;研发拿到一个项目要去查看代码&#xff0c;了解其代码结构&#xff0c;了解其依赖文件&#xff0c;jar包位置&#xff0c;图片等文件存储路径等&#xff1b;而maven是规范地将对应的源代码、依赖文件等定义其固定位置&…

[数据集][目标检测]电动车入梯进电梯电单车入梯检测数据集VOC+YOLO格式7106张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;7106 标注数量(xml文件个数)&#xff1a;7106 标注数量(txt文件个数)&#xff1a;7106 标注…

[环境配置]ubuntu20.04安装后wifi有图标但是搜不到热点解决方法

最近刚入手一台主机&#xff0c;暗影精灵8plus电竞主机&#xff0c;安装ubuntu后wifi怎么都搜不到热点&#xff0c;前后重装系统6次才算解决问题。这个心酸历程只有搞技术人才明白。下面介绍我解决过程。 首先主机到手后是个windows10系统&#xff0c;我用无线网连接了一下&am…

Java发邮件:如何配置SMTP服务器实现发信?

Java发邮件功能实现的教程&#xff1f;Java发邮件的方式有哪些&#xff1f; 无论是用于用户注册确认、密码重置&#xff0c;还是系统通知&#xff0c;Java发邮件都是不可或缺的一部分。AokSend将详细介绍如何配置SMTP服务器&#xff0c;以便在Java发邮件时能够顺利发送邮件。 …

Ozon数据插件,Ozon数据插件好用吗

在跨境电商的浩瀚星海中&#xff0c;每一位卖家都像是航行者&#xff0c;不断探索着市场的奥秘与机遇。而在这个过程中&#xff0c;一款高效、精准的数据分析工具&#xff0c;无疑是每位船长手中的罗盘与望远镜。今天&#xff0c;我们就来深入探讨一款备受瞩目的跨境电商辅助神…