当前位置: 首页 > news >正文

【uniapp*vue3】app/h5 webview通讯方案

本文旨在解决vue3版本下uniapp h5项目向app项目中webview通讯问题
问题产生于uniapp不支持vue3使用template.h5.html 自定义打包模板

h5向app发送信息

有很多文章指出h5项目使用uni.postmessage 这个api需要在template.h5.html引入一个js文件 然后改下webuni变量再从manifest.json配置下改文件 就可以全文使用了

vue2环境是可以参考的
文章指向通信跳转文章

但这方案在vue3环境下是无法使用的
在这里插入图片描述
vue3的解决方案是直接在需要使用的页面import引入该文件
直接调用webUni.postMessage即可

<script lang="ts" setup>
	import { MessageUtil } from "@/utils/MessageUtil";
	import webUni from '@/static/js/uni.webview.js'
	
	const saveImage = ()=>{
		webUni.postMessage({ data: { action: 'download', data: 'http://mj-1302596703.cos.ap-guangzhou.myqcloud.com/file/ttc7sKc4g0mcSL2KbtJg.png' } });
	}
</script>

接下来的问题就细化成将js文件改造成可支持model暴露了

const webUni = (function() {
    "use strict";
    try {
        var e = {};
        Object.defineProperty(e, "passive", {
            get: function() {
                return true;
            }
        }), window.addEventListener("test-passive", null, e)
    } catch (e) {}

    var n = Object.prototype.hasOwnProperty;

    function t(e, t) {
        return n.call(e, t);
    }

    var i = [],
        a = function(e, n) {
            var t = {
                options: {
                    timestamp: +new Date
                },
                name: e,
                arg: n
            };
            if (window.__dcloud_weex_postMessage || window.__dcloud_weex_) {
                if ("postMessage" === e) {
                    var a = {
                        data: [n]
                    };
                    return window.__dcloud_weex_postMessage ? window.__dcloud_weex_postMessage(a) : window.__dcloud_weex_.postMessage(JSON.stringify(a));
                }
                var o = {
                    type: "WEB_INVOKE_APPSERVICE",
                    args: {
                        data: t,
                        webviewIds: i
                    }
                };
                window.__dcloud_weex_postMessage ? window.__dcloud_weex_postMessageToService(o) : window.__dcloud_weex_.postMessageToService(JSON.stringify(o));
            }
            if (!window.plus) return window.parent.postMessage({
                type: "WEB_INVOKE_APPSERVICE",
                data: t,
                pageId: ""
            }, "*");
            if (0 === i.length) {
                var r = plus.webview.currentWebview();
                if (!r) throw new Error("plus.webview.currentWebview() is undefined");
                var d = r.parent(),
                    s = "";
                s = d ? d.id : r.id, i.push(s);
            }
            if (plus.webview.getWebviewById("__uniapp__service")) plus.webview.postMessageToUniNView({
                type: "WEB_INVOKE_APPSERVICE",
                args: {
                    data: t,
                    webviewIds: i
                }
            }, "__uniapp__service");
            else {
                var w = JSON.stringify(t);
                plus.webview.getLaunchWebview().evalJS('UniPlusBridge.subscribeHandler("'.concat("WEB_INVOKE_APPSERVICE", '",').concat(w, ",").concat(JSON.stringify(i), ");"));
            }
        },
        o = {
            navigateTo: function(e) {
                var n = e.url;
                a("navigateTo", {
                    url: encodeURI(n)
                });
            },
            navigateBack: function(e) {
                var n = e.delta;
                a("navigateBack", {
                    delta: parseInt(n) || 1
                });
            },
            switchTab: function(e) {
                var n = e.url;
                a("switchTab", {
                    url: encodeURI(n)
                });
            },
            reLaunch: function(e) {
                var n = e.url;
                a("reLaunch", {
                    url: encodeURI(n)
                });
            },
            redirectTo: function(e) {
                var n = e.url;
                a("redirectTo", {
                    url: encodeURI(n)
                });
            },
            getEnv: function(callback) {
                window.plus ? callback({
                    plus: true
                }) : callback({
                    h5: true
                });
            },
            postMessage: function(e) {
                a("postMessage", e.data || {});
            }
        };

    return o;
})();

export default webUni;

直接将其替换官方提供的文件代码就能使用了在这里插入图片描述
app接收

<web-view :webview-styles="webviewStyles" :src="url" @message="handlePostMessage"></web-view>


handlePostMessage(evt) {
			let data = evt.detail.data[0];
			const action = data?.action;
			switch (action) {
				case 'download': {
					saveFileToPhotosAlbum(data.data)
					break;
				}
			}
		},

相关文章:

  • UE5中按钮圆角,设置边框
  • Redis使用手册
  • 使用Hardhat实现ERC20 代币合约详解
  • 通俗易懂的DOM事件模型指南
  • 数据结构:哈希表(unordered_map)
  • 1.13作业
  • 人工智能之自动驾驶技术体系
  • 大学本科教务系统设计方案,涵盖需求分析、架构设计、核心模块和技术实现要点
  • 长尾关键词优化三步法:提升SEO搜索排名实战
  • MATLAB | 设置滑动窗口计算栅格数据的CV变异系数
  • MySQL数据库表约束详解
  • 一些时间方法
  • python入门 介绍及变量的使用
  • 低代码与开发框架的一些整合[2]
  • Error: error:0308010C:digital envelope routines::unsupported
  • My Metronome for Mac v1.4.2 我的节拍器 支持M、Intel芯片
  • 【工具篇】【深度解析 DeepAI 工具:开启 AI 应用新体验】
  • 机器翻译中的编码器、自注意和解码器
  • c语言中offseto宏
  • 单片机 code RO-data RW-data ZI-data以及OTA学习
  • 广西等地旱情缓解,水利部针对甘肃启动干旱防御Ⅳ级响应
  • 农行回应“病重老人被要求亲自取钱在银行去世”:全力配合公安机关调查
  • 普京批准俄方与乌克兰谈判代表团人员名单
  • 受贿3501万余元,中石油原董事长王宜林一审被判13年
  • 支持企业增强战略敏捷更好发展,上海市领导密集走访外贸外资企业
  • 甘肃:今年6月前,由县级党委、政府制定农村彩礼倡导性标准