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

这篇具有很好参考价值的文章主要介绍了uniapp 之 uniapp app 与uniapp H5的通信 webview,以及处理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通信的方法都放在里面,方便维护
    uniapp h5 uni.webview 使用,uniapp,uni-app,vue.js

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的一些方法
uniapp h5 uni.webview 使用,uniapp,uni-app,vue.js

最后,就是在相应的页面中调用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)
		})
	})
}


总结:文章来源地址https://www.toymoban.com/news/detail-794476.html

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

到了这里,关于uniapp 之 uniapp app 与uniapp H5的通信 webview,以及处理H5页面的手机物理返回问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • uniapp 开发 APP 使用 web-view 引入H5 app与 h5 页面通信

    uniapp 可以同时兼容 APP 和 H5,但有时候有些功能在 APP 中实现不了而在 H5 中可以实现,就可以采用 web-view 的方式在 APP 模式下显示 H5 页面。但是 APP 和 H5 储存的参数是不能共享的,例如token,就涉及到 APP 与 H5 之间的参数传递。 H5 向 APP 传参:引入 webview.js ,调用 uni.postMes

    2024年02月13日
    浏览(11)
  • 关于uniapp的app和uniapp的H5互相通讯实现H5调取app扫码再传入H5(app内嵌H5,webView)

    关于uniapp的app和uniapp的H5互相通讯实现H5调取app扫码再传入H5(app内嵌H5,webView)

    一.h5传值给app 1,在h5项目的mian.js中引入 //此处需要注意的是如果项目本身要打包成app,记得使用条件编译,否则在app运行时本次引入会报错 2.h5页面给app传值部分 3.app页面接收 html js由于我做的是扫码 二.扫码过后app向h5传值并跳转 1.app发起传值 在“一“的app接收h5传值部分我

    2024年02月02日
    浏览(17)
  • uniapp app的webview与h5交互操作

    uniapp app的webview与h5交互操作

    app里的webview与h5交互操作,需要在h5页面加点代码,然后才能执行app里的方法 官方地址 在nvue页面里才能实现与h5的交互,设置webview的高度

    2024年02月11日
    浏览(15)
  • 项目笔记——安卓WebView加载H5页面问题处理

    项目为Android应用,使用WebView加载H5页面。 此文仅记录项目开发中遇到的问题及解决方法。 目录 一,下拉刷新 二,H5唤起支付宝 三,H5本地文件选择 四,加载图片失败 五,输入框被软键盘遮挡 页面Reload需要下拉刷新功能,所以使用了SwipeRefreshLayout包裹WebView。但使用时不管

    2024年02月02日
    浏览(16)
  • app中内嵌一个WebView,然后在WebView中加载该H5页面来达到打开小程序

    在 Android 应用中内嵌一个 WebView 来打开 H5 页面,从而打开小程序,可以通过以下步骤实现: 添加依赖库 首先,在项目的 build.gradle 文件中添加如下依赖库: 在布局文件中添加 WebView 在布局文件中添加一个 WebView 组件,并在 Activity 中获取该组件: 加载 H5 页面 使用 WebView 组件

    2024年02月14日
    浏览(13)
  • 开发uniapp过程中对app、微信小程序与h5的webview调试

    开发uniapp过程中对app、微信小程序与h5的webview调试

        因为在开发中使用到了webview,因为出现一些问题,所以需要对webview进行跟踪调试,但因为app,h5与微信小程序不一样,所以需要单独说一下。     一、H5     这个比较简单,因为都是在chrome,用F12就可以  二、对微信小程序       因为普通的uniapp页面上都能通过F12可以

    2024年02月11日
    浏览(10)
  • uniapp手机APP webview使用echarts显示问题(腾讯X5内核)

    uniapp手机APP webview使用echarts显示问题(腾讯X5内核)

    一、问题描述 webview页面中引用了一些基于echarts封装的js文件,用于在手机上展示仪表盘 在iQOO8 pro上显示并无问题,而在vivo x21A上显示有问题,如下图所示 vivo x21A iQOO8 pro 二、解决过程 先说结论,出现这个问题是因为echarts和手机浏览器内核不兼容,webview组件默认使用的是手

    2024年02月09日
    浏览(8)
  • h5项目编写成app,你还不了解吗?直接打包和套webview结合uniapp两种实现方式

    h5项目编写成app,你还不了解吗?直接打包和套webview结合uniapp两种实现方式

    在各种需求中 大致有两类 让h5直接运行成app,有一个成熟的h5项目,想直接打包app 不想触发app更新,又能获取最新的更新效果,使用webview套h5,最终生成app 今天笔者带大家粗略实现以上的两个需求 打开hbuiderx 新建项目 选择 5+app 删除其他的多余文件 将自己打包生成的文件进

    2024年02月04日
    浏览(12)
  • Vue H5项目,怎么引入uni.webview sdk,调用uni postMessage实现手机蓝牙连接打印功能(uniapp)

    Vue H5项目,怎么引入uni.webview sdk,调用uni postMessage实现手机蓝牙连接打印功能(uniapp)

    目前公司Vue H5项目,用webview打包成APP,现产品提出这样打包出来的app运行较慢,需要用uniapp方式(即使用HBuilder编辑器来打包H5)来打包,那需要的基座就不是安卓的基座而是uniapp的基座,而H5项目实现手机扫描功能就需要调用uniapp的基座的方法。 Vue2 开发的移动端项目(H5项

    2024年02月20日
    浏览(16)
  • uniapp H5页面、小程序页面获取手机号拨打电话

    uniapp H5页面、小程序页面获取手机号拨打电话

    效果图: 1、H5页面----手机号写死: 2、H5页面----动态获取手机号拨打: APP: 小程序: methods:

    2024年02月07日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包