前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >uniapp在web-view加载的本地及远程HTML中调用uni的API及网页和vue页面通讯

uniapp在web-view加载的本地及远程HTML中调用uni的API及网页和vue页面通讯

作者头像
高久峰
发布于 2023-12-17 10:11:14
发布于 2023-12-17 10:11:14
3.8K024
代码可运行
举报
运行总次数:24
代码可运行

uni-app的web-view组件,支持加载远程网页,在app环境下,还支持加载本地HTML页面。

在web-view加载页面中,会涉及wx、plus、uni等对象的使用。

  • 小程序下使用wx的api,需要引入微信提供的https://res.wx.qq.com/open/js/jweixin-1.4.0.js。
  • 在app下默认有plus对象,不需要引入js文件。
  • 不管是在小程序下还是在app下,使用uni的api,需要引入https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.0.1.52.js

本文会详述在webview里的uni对象的使用方式,以及和vue页面的通讯方式。

HBuilderX 1.0.0 版本开始,uni-app 支持在 web-view 中调用 uni 的 API。

引用依赖的文件

在 web-view 加载的 HTML 中调用 uni 的 API,需要在 HTML 中引用必要的 JS-SDK。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- 微信 JS-SDK 如果不需要兼容小程序,则无需引用此 JS 文件。 -->  
<script type="text/javascript" src="//res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>  
<!-- uni 的 SDK,必须引用。 -->  
<script type="text/javascript" src="//js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.0.1.52.js"></script>

Tips

  • 这些 JS 文件是在 web-view 加载的那个 HTML 文件中引用的,而不是 uni-app 项目中的文件。
  • 如果不考虑微信小程序,则无需引入微信的 JS-SDK。
  • 两个文件同时引入时,注意引入的顺序,微信的需要在前。

调用的时机

在引用依赖的文件后,需要在 HTML 中监听 UniAppJSBridgeReady 事件触发后,才能安全调用 uni 的 API。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.addEventListener('UniAppJSBridgeReady', function() {  
    uni.getEnv(function(res) {  
        console.log('当前环境:' + JSON.stringify(res));  
    });  
});

页面跳转

支持调用所有的 uni 路由方法,可以实现从 HTML 重新跳转回应用内的页面。

在 UniAppJSBridgeReady 后,调用路由方法跳转到应用内的页面。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.addEventListener('UniAppJSBridgeReady', function() {  
    document.querySelector('.btn-list').addEventListener('click', function(evt) {  
        var target = evt.target;  
        if (target.tagName === 'BUTTON') {  
            var action = target.getAttribute('data-action');  
            if(action === 'navigateTo') {  
                uni.navigateTo({  
                    url: '/pages/component/button/button'  
                });  
            }  
        }  
    });  
});

发送消息

可以通过 uni.postMessage 在 HTML 中向应用发送消息。要实现此功能,需要完成以下两步工作。

监听 web-view 的 message 事件

监听 web-view 组件的 message 事件,然后在事件回调的 event.detail.data 中接收传递过来的消息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>  
    <view>  
        <web-view src="http://192.168.1.1:3000/test.html" @message="handleMessage"></web-view>  
    </view>  
</template>  

<script>  
    export default {  
        methods: {  
            handleMessage(evt) {  
                console.log('接收到的消息:' + JSON.stringify(evt.detail.data));  
            }  
        }  
    }  
</script>

从 HTML 向应用发送消息

uni.postMessage 中的参数格式,必须是 data: {}。也就是说,传递的消息信息必须在 data 这个对象中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.addEventListener('UniAppJSBridgeReady', function() {  
    uni.postMessage({  
        data: {  
            action: 'postMessage'  
        }  
    });  
});

每次执行 postMessage 后,传递的消息会以数组的形式存放。因此,在 web-view 的 message 事件回调中,接收到的 event.detail.data 的值是一个数组。

获取当前环境信息

HTML 在不同的环境下,可能需要执行不同的操作或传递不同的消息。可以通过 uni.getEnv() 方法,来获取当前的环境信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.addEventListener('UniAppJSBridgeReady', function() {  
    uni.getEnv(function(res) {  
        if (res.plus) {  
            console.log('当前环境为【5+App】');  
        } else if (res.miniprogram) {  
            console.log('当前环境为【微信小程序】');  
        }  
    });  
});

本地 HTML

自 HBuilderX v1.1.0 起,在 5+App 平台下 web-view 支持加载应用内的 HTML 资源。 本地的 HTML 资源,必须存放在规定的目录下,即 uni-app 项目->hybrid->html 目录。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
├─common      
├─components        
├─hybrid  
│  └─html  
│          test.html        
├─pages              
├─static  
│  App.vue  
│  main.js  
│  manifest.json  
│  pages.json

与 html 文件相关的 css、js 等本地资源,同样放在这个 hybrid->html 目录下。 这个hybrid目录不会被编译器编译,所以这里的不能放vue文件,而其他目录也不能放本地HTML文件。 未来hybrid目录还会支持其他语言在uni-app的中的混合使用。

注意:在本地 HTML 中引入网络资源时,必须补全协议。比如:https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.0.1.52.js

运行体验

示例中 web-view 加载的是一个本机的测试地址,这个测试 HTML 见附件。

  • 加载网络地址的话,需要在本机启动一个服务将此 HTML 放进去,然后修改 hello uni-app 中的 web-view 例子的 src 地址为可访问的局域网地址。
  • 如果是加载本地 HTML 的话,就直接新建目录将此 HTML 放进去,然后修改 web-view 的 src 为 /hybrid/html/test.html 即可。
  • 参考文档:web-view

web-view组件在app中的窗体关系和plus.webview操作方式

uni-app的vue页面本身是一个webview,vue页面里的web-view组件,其实是一个子webview。 但一个vue页面不能放多个web-view组件,这个组件默认是全屏的(不会覆盖原生头和原生导航)。 使用plus代码获得当前webview的对象后(参考此文https://ask.dcloud.net.cn/article/35036),再获取子webview,其实也可以得到web-view组件所对应的plus的webview对象,进而再使用plus.webview的丰富api。 获取子webview时注意时机,获取方法执行太早可能获取不到。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
关于 uni-app 使用 web-view 页面之间互相跳转、通信等问题的解决方案
最近开发小程序的时候、需要嵌入一个第三方网站、并且和第三方网站有些交互。这个第三方页面本身就是一个 HTML 页面、想着把它给嵌入到 uni-app 中,结果没实现......(很多的 js 代码在小程序中不识别)。
hedeqiang
2019/12/17
12.9K0
『uni-app』web-view 大量数据通信
该组件是一个浏览器组件,可以承载网页的内容。而且该组件是全屏的,会覆盖该组件之外的其他内容。
德育处主任
2022/09/23
1.3K0
『uni-app』web-view 大量数据通信
【uniapp】H5向uniapp通信存储数据——H5如何传递数据到uniapp方法的解决方案
最近在做H5号码认证无感登录,发现市场上的H5登录文档不健全,没有适合uniapp的,综合对比了多家,找了一家个推的接入,由于SDK、demo都是H5,精力有限,于是打算通过H5完成认证,通过回调数据发送给Uniapp进行验证
德宏大魔王
2024/05/25
4750
【uniapp】H5向uniapp通信存储数据——H5如何传递数据到uniapp方法的解决方案
uniapp 在app和小程序端使用webview进行数据交互
结论:app端支持比较好可以做到实时传递,微信小程序支持比较差,小程序向url传参只能通过url,url向app传参需要特定时机(后退、组件销毁、分享、复制链接)触发才能收到消息。
风花一世月
2024/03/19
8210
uni-app 与 Vue H5 项目通讯
可以内嵌在移动端,实现前端的混合式开发,大多数混合式开发框架都是基于WebView模式进行二次开发的。比如:APIcloud、uni-app等等的框架。
游魂
2020/10/26
2.4K0
uni-app 与 Vue H5 项目通讯
【开发日记】使用WebRTC实现类微信的实时音视频通话
需要使用uni-app技术开发一个类似微信一样的实时音视频通话功能,经过大量的调研和尝试,最终有存在两个方案:第一个方案是使用WebRTC技术实现P2P点对点实时通信;第二个方案是使用现成的阿里、腾讯、声网等平台相关产品。
全栈开发日记
2024/11/14
5351
【开发日记】使用WebRTC实现类微信的实时音视频通话
【愚公系列】2022年09月 微信小程序-webview内嵌网页的授权认证
随着微信小程序的广泛应用,小程序的用户越来越多,但受其小程序体积限制的影响,不能够完全满足用户的要求,应运而生的web-view组件很好的解决的这一问题。
愚公搬代码
2022/09/28
9170
【愚公系列】2022年09月 微信小程序-webview内嵌网页的授权认证
【开发日记】使用WebRTC实现类微信的实时音视频通话
需要使用uni-app技术开发一个类似微信一样的实时音视频通话功能,经过大量的调研和尝试,最终有存在两个方案:第一个方案是使用WebRTC技术实现P2P点对点实时通信;第二个方案是使用现成的阿里、腾讯、声网等平台相关产品。
全栈开发日记
2024/11/23
6160
【开发日记】使用WebRTC实现类微信的实时音视频通话
微信小程序 web-view 开发踩坑大全
如果要在小程序中使用 web-view 组件,则首先需要开发者账号不仅是该小程序的开发者而且还有网页开发权限,这需要在该小程序关联的公众号里面绑定开发者账号为开发者。不然在开发工具里面会弹窗提示没有网页开发权限。提示如下:
极乐君
2019/08/02
4.7K0
微信小程序 web-view 开发踩坑大全
小程序打开h5页面,并实现H5与小程序的通信
web-view组件是承载网页的容器。会自动铺满整个小程序页面,个人类型的小程序暂不支持使用。
拿我格子衫来
2022/01/24
2.9K0
uni-app跳转网页,这种方式有个最大好处,你知道吗?
保留当前页面,跳转到应用内的某个页面,使用uni.navigateBack可以返回到原页面。
大风写全栈
2024/11/07
1.4K0
uni-app跳转网页,这种方式有个最大好处,你知道吗?
干货|HTML5 项目如何转小程序运行
今天来给大家分享的办法:在集成了 FinClip SDK 的 App 中运行小程序,那这里我们就需要关注以下两个注意事项:
用户10245619
2023/03/14
2.7K0
uni-app&H5&Android混合开发三 || uni-app调用Android原生方法的三种方式
  关于H5的调用Android原生方法的方式有很多,在该片文章中我主要简单介绍三种与Android原生方法交互的方式。
追逐时光者
2021/07/27
6.7K0
微信小程序webview保存图片
在小程序的 webview 里保存图片. 因为微信的 js-sdk 没有提供 saveImageToPhotosAlbum 方法
chuchur
2022/10/25
3.6K0
『UniApp』核心语法
下载地址:https://www.dcloud.io/hbuilderx.html
程序员NEO
2023/12/26
5872
『UniApp』核心语法
微信小程序和web之间的交互
通常我们写了一套自适应的 web 程序,想在多种环境中使用.比如 app 里,微信小程序里,各种 app 分享中, 假如只是能使用 app 浏览,问题不大,但是要在被嵌入 app 里面和 app 本身交互,就要做各种折腾, 如是就有了本文.
chuchur
2022/10/25
1.4K0
uni-app与Vue的区别
cover-view需要多强调几句,uni-app的非h5端的video、map、canvas、textarea是原生组件,层级高于其他组件。如需覆盖原生组件,比如在map上加个遮罩,则需要使用cover-view组件
红目香薰
2022/11/29
9010
uni-app-x
uni-app x 没有使用js和webview,它基于 uts 语言。在App端,uts在iOS编译为swift、在Android编译为kotlin,完全达到了原生应用的功能、性能。
阿超
2024/01/21
4080
uni-app forHarmony 实践
前面分别了两篇 uni-app forHarmony 的文章,大家对这个技术比较感兴趣,所以我也就联合坚果派开发者,一起针对本次实践做出一个探索,你可以在后面看到本次的实践效果。接下来开始正文吧。
徐建国
2024/08/27
1420
uni-app forHarmony 实践
微信小程序官方组件展示之开放能力web-view源码
以下将展示微信小程序之开放能力web-view源码官方组件能力,组件样式仅供参考,开发者可根据自身需求定义组件样式,具体属性参数详见小程序开发文档。
软件事业部
2022/11/10
1.1K0
推荐阅读
相关推荐
关于 uni-app 使用 web-view 页面之间互相跳转、通信等问题的解决方案
更多 >
LV.6
深圳歌力思服饰股份有限公司技术顾问
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验