uniapp 之 uniapp app 与uniapp H5的通信 webview,以及处理H5页面的手机物理返回问题

news2024/11/15 18:52:58

目录

      • app给H5传参:通过h5地址传参
      • app给H5传参:通过方法`evalJS`传参
      • H5给app传参:通过`web-view` 组件的`@message`绑定的方法
      • 处理H5页面的手机物理返回问题

APP端:

<web-view :webview-styles="webviewStyles" :src="src" @message="handleByH5"></web-view>
data() {
	return {
		wv: null,
		src: '',
		webviewStyles: {
			progress: {
				color: '#43ACFF'
			}
		},
		isCanBack: true, // 是否允许手机物理返回
	}
}

引用

  • web-view


app给H5传参:通过h5地址传参

这个方法简单,就是直接通过src 地址后面通过? &拼接参数

  • app端
onLoad() {
	this.src = 'https://editor.csdn.net/md?articleId=130581348'
}
  • h5端通过uniapp生命周期函数onLoad接收参数
onLoad({ articleId }) {
	// .....
}


app给H5传参:通过方法evalJS传参

H5给app传参:通过web-view 组件的@message绑定的方法

处理H5页面的手机物理返回问题

这里将 app给H5传参:通过方法evalJS传参H5给app传参:通过web-view 组件的@message绑定的方法 处理H5页面的手机物理返回问题写一起了,方便查看app和H5之间的通信交互。

详见代码

  • app端
onBackPress(options) {
	// 这里return true禁用手机的物理返回,避免H5页面使用返回的时候也调用app的手机物理返回
	// return false 允许手机的物理返回
	if (options.from == 'backbutton') {
		return this.isCanBack
	}
},
onLoad() {
	// #ifdef APP-PLUS
	this.$showLoading('正在努力加载中,请稍候……')
	let currentWebview = this.$scope.$getAppWebview() //此对象相当于html5plus里的plus.webview.currentWebview()。在uni-app里vue页面直接使用plus.webview.currentWebview()无效
	setTimeout(() => {
		let wv = currentWebview.children()[0]
		this.wv = wv
		this.wv.setStyle({
			bottom: 0
		})
		// 处理web-view h5页面的手机物理返回问题
		plus.key.addEventListener('backbutton', () => {
			// 监听返回事件
			wv.canBack((e) => {
				if (e.canBack) {
					this.isCanBack = true
					wv.back() // 返回上一页
				} else {
					// wv.close(); // 关闭嵌入的H5应用
					this.isCanBack = false
				}
			})
		})
		this.$hideLoading()
	}, 1000) // 注意这里跳转过去的都是相当于是一级页面,所以需要延迟一下,如果报xxx is not undefined,则是因为对应的页面还没有加载出来,相应的xxx 方法就没有挂载上去
	// #endif
},
methods: {
	// 监听 H5 发送过来的消息,也就是webView.postMessage过来的信息
	handleByH5(data) {
		console.log('监听H5的操作 ----index------ data', data)
		const { pageBack } = data.detail.data[0]
		switch (action) {
			case 'pageBack':
				pageBack()
				break
			case 'getLocation':
				// 获取位置
				this.getCurrentLocation()
				break
		}
	},
	// 获取当前位置信息
	async getCurrentLocation() {
		const res = await getLocation()
		console.log('获取当前位置信息----', res)
		if (res && !res.errMsg) {
			const { longitude, latitude, address } = res
			let locationInfo = {
				longitude,
				latitude,
				location: address.poiName
			}
			// 将结果返回给H5页面,evalJS触发H5中绑定在window上的方法getLocationByApp,达到传参的目的
			this.wv.evalJS(`getLocationByApp('${JSON.stringify(locationInfo)}')`)
		} else {
			// 将结果返回给H5页面
			this.wv.evalJS(`getLocationByApp('${JSON.stringify(false)}')`)
		}
	},
}

引用

  • App端web-view的扩展:上述出现的相关api官网都有说明
  • evalJS:在Webview窗口中执行JS脚本
  • h5端
    定义一个webviewUtil.js文件,将所有的与app通信的方法都放在里面,方便维护
    在这里插入图片描述

webviewUtil.js

import $this from '@/main'
// $this vue实例,在main.js中已经将vue实例抛出

/**
 * 调用app的获取定位信息
 */
export const getLocationByApp = (callback) => {
	// 这一步是向APP传参,APP中通过web-view的@message绑定的handleByH5方法接收对应的参数
	$this.$myUni.webView.postMessage({
		data: {
			action: "getLocation",
		},
	});
	window.getLocationByApp = (res) => {
		let result = JSON.parse(res);
		callback && callback(result)
	}
	setTimeout(() => {
		let defaultLocationInfo = {
			longitude: 115.995196,
			latitude: 28.675518,
			location: '南昌市'
		}
		callback && callback(defaultLocationInfo)
	}, 1000)
}

main.js

import Vue from 'vue'
import App from './App'
// 需要使用到uni.webview.js的一些方法
import * as uniWebView from '@/common/uni_webview.js'

document.addEventListener('UniAppJSBridgeReady', () => {
	// 将uniWebView赋值给vue原型,方便调用
	Vue.prototype.$myUni = uniWebView
});

Vue.config.productionTip = false

App.mpType = 'app'

const app = new Vue({
	...App
})
app.$mount()

// 将vue 实例抛出,方便某些js文件中调用vue api
export default app;

需要下载 uni-webview.js,来调用webview的一些方法
在这里插入图片描述

最后,就是在相应的页面中调用webviewUtil.js封装的方法

export const getCurrLocation = () => {
	return new Promise((resolve) => {
		getLocationByApp((locationInfo) => {
			if (!locationInfo) {
				let defaultLocationInfo = {
					longitude: 115.995196,
					latitude: 28.675518,
					location: '南昌市'
				}
				resolve(defaultLocationInfo)
				return
			}
			resolve(locationInfo)
		})
	})
}


总结:

  • app给h5通信
    • 可以通过webview组件绑定的src地址拼接参数传参;
    • 也可以通过evalJS方法调用H5端window.xxx绑定的方法,通过方法传参;
  • h5给app传参
    • 通过下载的uni.webview.js文件调用webView.postMessage传参,APP通过web-view组件的@message绑定的方法接收参数

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python学习之【继承、封装、多态】

#来评选你心中的TOP1编程语言# 前言 距离上篇文章 python学习之【类和对象】已有三个星期之久&#xff0c;这篇文章介绍 面向对象的三大特征——封装&#xff0c;继承&#xff0c;多态。 对于编程初学者来说&#xff0c;学习python应该是比较好入手的&#xff0c;文末会给大家…

计算机视觉:多相机硬件同步拍摄

计算机视觉&#xff1a;多相机硬件同步拍摄 传感器同步硬件同步信号FSYNC信号STROBE信号 硬件接线硬件设备接线步骤&#xff1a; 软件驱动参考文献 传感器同步 目前主要有两种方法来同步不同传感器的信息&#xff08;帧、IMU数据包、ToF等&#xff09;&#xff1a; 硬件同步&…

2023-07-01:redis过期策略都有哪些?LRU 算法知道吗?

2023-07-01&#xff1a;redis过期策略都有哪些&#xff1f;LRU 算法知道吗&#xff1f; 答案2023-07-01&#xff1a; 缓存淘汰算法&#xff08;过期策略&#xff09; 当Redis的内存超出物理内存限制时&#xff0c;内存中的数据就会频繁地与磁盘进行交换&#xff0c;这个过程…

二叉树的练习

文章目录 单值二叉树检查两颗树是否相同对称二叉树二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历另一颗树的子树通过前序遍历的数组构建二叉树判断二叉树是否是完全二叉树层序遍历k层节点数二叉树的销毁二叉树的整体 单值二叉树 单值二叉树&#xff0c;可以使用等式的传递…

Java基础---有了基本类型为什么还需要包装类

目录 缘由 基本类型和包装类型的区别 如何理解自动拆装箱 哪些地方会自动拆装箱 自动拆装箱与缓存 缘由 Java中有8种基本数据类型&#xff0c;这些基本类型又都有对应的包装类 因为Java是一种面向对象语言&#xff0c;很多地方都需要使用对象而不是基本数据类型比如&…

Domino Admin管理客户机中为每个管理域设置不同的图标

大家好&#xff0c;才是真的好。 一直在讲Domino管理中的单个网络 域&#xff0c;很少讲到多个Domino网络域的管理。其实&#xff0c;很多企业会有多个Domino网络域。因为以前多个部门或组织、企业等合并&#xff0c;或者隔离国内和国外的目录隔开等等&#xff0c;都会产生多个…

从0-1手写一个RPC框架

前言 什么是RPC RPC&#xff08;Remote Procedure Call&#xff09;远程过程调用&#xff0c;简言之就是像调用本地方法一样调用远程服务。目前外界使用较多的有gRPC、Dubbo、Spring Cloud等。相信大家对RPC的概念都已经很熟悉了&#xff0c;这里不做过多介绍。 为啥要自己写…

nvm 和 nrm安装使用

前端工具推荐&#xff1a;nvm&#xff08;Node 版本管理工具&#xff09; 和 nrm&#xff08;管理npm源&#xff09;&#xff1a; 一、nvm 1.1 nvm 是什么 1.2 安装 nvm 1.3 使用 nvm 二、nrm 2.1 nrm 是什么 2.2 安装 nrm 2.3 使用 nrm 一、nvm 如果直接将 node 安装到…

20230701:成电的“七年之痒”,毕业啦

毕业那些事儿 毕业随笔写在最后 毕业随笔 伴随着走完最后一道流程&#xff0c;成电7年&#xff0c;总算是毕业了。经济下行&#xff0c;行业寒冬&#xff0c;全被90后赶上了&#xff0c;庆幸学校的金字招牌让自己斩获了不少OFFER。荒废了半年的跑步和博客计划&#xff0c;接下…

【测试开发】概念基础

目录 一. 需求 1. 用户需求 2. 软件需求 3. 从测试人员的角度看需求 二. 测试用例 三. BUG 四. 开发模型 1. 软件的生命周期 2. 开发模型 2.1 瀑布模型 2.2 螺旋模型 2.3 增量&#xff0c;迭代模型 2.4 敏捷模型 SCRUM 五. 测试模型 1. V模型 2. W模型 (双V模…

开源免费的多数据库工具Chat2DB

Chat2DB使用 当前使用的版本为1.0.11。 一.Chat2DB介绍 Chat2DB 是一款开源免费的多数据库客户端工具。 能够将自然语言转换为SQL&#xff0c;也可以将SQL转换为自然语言。 支持windows、mac本地安装&#xff0c;也支持服务器端部署&#xff0c;web网页访问。 支持多种数据库…

Hexo基本建站

目录 一、前言 二、Hexo安装、新建、启动 三、架构说明 四、写博客 五、打包 六、发布到GitHub 1.新建仓库 2.安装插件 3.修改配置文件&#xff1a;_config.yml 4.部署github 5.查看仓库 6.访问网站 一、前言 安装 Git安装 Node.js 二、Hexo安装、新建、启动 # 安装 h…

智慧园区平台建设解决方案

智慧园区是指利用现代互联网物联网技术&#xff0c;对园区内的设施、设备和人员进行高效管理和智能化运营的一种模式。越来越多的城市开始致力于发展智慧园区&#xff0c;实现园区内的资源共享和高效利用。为了让智慧园区达到最佳的效果&#xff0c;我们需要从平台建设方面入手…

Prettier - Code formatter配置(vscode)

1.安装Prettier 2.设置-->搜索format on save 并打勾 3.搜索default format 并选择Prettier - Code formatter 4.点击右上角打开setting.json 5.看最后一行是否存在如下配置,有就说明配置成功,没有重新前面步骤重新设置一下 6.根目录是否存在.prettierrc.json,没有创建一下 …

vue3原理和源码分析 - watch 源代码

https://github.com/vuejs/vue-next/blob/master/packages/runtime-core/src/apiWatch.ts 目录 Watch /packages/runtime-core/src/apiWatch.ts watch.dot https://github.com/vuejs/vue-next/blob/master/packages/runtime-core/src/apiWatch.ts Watch /packages/runtime…

6.3 B树,B+树

多路平衡查找树 1.定义 B树的阶&#xff1a;B树中所有结点的孩子个数的最大值&#xff0c;表示成m m阶B树&#xff1a;空树或者满足如下特性的m叉树 特性&#xff1a; 1.树中每个结点最多子树 m 关键字m-1 2.根节点不是终端结点&#xff0c;至少有两棵子树 3.根结点除外&…

基于Elasticsearch + Fluentd + Kibana(EFK)搭建日志收集管理系统

目录 1、EFK简介 2、EFK框架 2.1、Fluentd系统架构 2.2、Elasticsearch系统架构 2.3、Kibana系统架构 3、Elasticsearch接口 4、EFK在虚拟机中安装步骤 4.1、安装elasticsearch 4.2、安装kibana 4.3、安装fluentd 4.4、进入kibana创建索引 5、Fluentd配置介绍 Elas…

2023年最受欢迎和最佳WordPress主题(专家精选)

您在找2023年最佳WordPress主题吗&#xff1f; 免费和高级WordPress主题有数以千计&#xff0c;初学者很难为他们的网站选择合适的WordPress主题。 在本文中&#xff0c;我们将分享我们专家精选的2023年所有最受欢迎和最佳的WordPress主题。 本文网址: 2023年最受欢迎和最佳…

Nautilus Chain 推出全新 Layer3 DID 公民身份,限量 10 万枚免费发放

Nautilus Chain 是目前行业内首个模块化的 Layer3 机构链&#xff0c;该链此前基本完成了测试网的早期测试&#xff0c;并有望在近期上线主网。Nautilus Chain 近阶段市场活动频频&#xff0c;除了此前举办全球行活动推广 Layer3 概念外&#xff0c;其也在同期联合 Stanford Bl…

wps文档忘记保存关闭了怎么恢复

1、点击WPS左上角小箭头&#xff0c;点击下拉菜单中的工具选项&#xff0c;然后点击里面的备份中心。 2、在WPS的右侧会看到备份中心的小窗口&#xff0c;里面有自动备份的文件&#xff0c;还可以点击一键恢复即可复原之前的文件内容。 可以对之前时间段的文件打开。