uniapp app 端通过webview引入外部 js , webview 与 app 通信

devtools/2024/9/29 16:04:06/

背景

用户登录需要接入腾讯的无感验证,在 index.html 文件里引入 js 文件是不生效的。查看官网相关内容,app 引入只支持 webview 的形式,因为他的 js 文件里面会用到浏览器里的变量,因此就算下载到本地引入也无法使用。

当前项目已经使用 uniapp 完成了 h5 的相关内容,包含登录页。所以 app 端只需要用 webview 引入 h5 页面。

如果没有 h5 端,则需要在 放在特定目录下进行访问 web-view | uni-app官网 (dcloud.net.cn)

所以最终的方案就是,登录页组件判断当前环境如果是 app 则使用 webview 加载 h5 登录页地址,并且携带参数用于告知是从 app 页跳转过来。

网页可以正常使用引入 js 文件,这里判断没有引入的话 创建一个 script 元素进行加载

javascript">const script = document.createElement("script")
script.src = xxxxxxxxxx
document.head.appendChild(script)
script.onload = () => {xxxxxxxxxxxxx
}

登录成功过后 webview 和 app 通信返回用户信息

主要问题

本地调试

uniapp 修改 h5 代码之后我希望直接把 localhost:8080 的页面放到 webview 的 地址里进行调试,但是 app 的页面会报错显示无法访问。

首先怀疑是 协议的原因,在打包过后,本地启了nginx 服务,访问 https 仍然有问题。

这个时候怀疑证书,但是上网找了一个 http 的网页,没有安全证书仍然可以访问。

上网搜索发现可以通过ip直接访问,所以怀疑127.0.0.1 这个ip有问题,导致无法访问,修改为 本机 ipv4 地址后访问正常了,这个时候可以同时调试了。

Login.vue

<!-- #ifdef H5 -->
登录页相关内容
<!-- #endif -->
<!-- #ifdef APP -->
<web-view src="http://ipv4地址:8080/#/login?from=app" @message="handleMessage"></web-view>
<!-- #endif -->

webview 和 app 通信

首先要按照官网写的引入 uni.webview.js 文件来实现通信,这里下载了 1.5.6 的js文件,然后放在本地,在 main.js 文件里进行了导入 https://gitcode.net/dcloud/uni-app/-/raw/dev/dist/uni.webview.1.5.6.js

  • App 端使用 uni.web-view.js 的最低版为 uni.webview.1.5.4.js
javascript">// main.js
// #ifdef H5
import * as uni from './utils/uni.webview.1.5.6'
// #endif

踩坑点: 本来引入了 uni.webview.js 文件之后使用 uni.postMessage 方法就可以向 app 传递信息,官网也是这么写的,实际上在 uni.webview.postMessage

登录信息获取之后通过 webview 携带的参数判断是 app 跳转过来的,那么就向 app 发送用户信息。

<!-- login.vue -->
// #ifdef H5if (this.$route.query?.from === 'app') {uni.webView.postMessage({data: res.data})return;}// h5 正常处理逻辑this.callBack(res.data)// #endif	

app 端接收信息 这里 handleMessage 写接收后的逻辑

<!-- login.vue-->
<web-view src="http://ipv4地址:8080/#/login?from=app" @message="handleMessage"></web-view>methods: {handleMessage(info) {this.callBack(info.detail.data[0])}}

这里要注意的是传递的时候的数据是以数组形式接收的。


http://www.ppmy.cn/devtools/118757.html

相关文章

bash使用注意事项

注意事项 在 Bash 脚本中&#xff0c;变量的取值、赋值和定义有一些注意事项&#xff0c;下面列出了一些关键点&#xff1a; 1. 变量赋值 没有空格&#xff1a;在赋值时&#xff0c;等号 前后不能有空格。例如&#xff1a; my_varvalue # 正确 my_var value # 错误字符限…

Elasticsearch实战应用:构建高效搜索引擎

在大数据时代&#xff0c;如何高效存储和检索海量信息成为了一个重要课题。Elasticsearch作为一个开源的分布式搜索引擎&#xff0c;以其强大的搜索能力和灵活的扩展性&#xff0c;成为了许多企业和开发者的首选。本文将深入探讨Elasticsearch的实战应用&#xff0c;包括基本概…

前端框架对比与选择:React、Vue、Angular 与 Svelte 的全方位分析

前言 随着前端技术的快速发展&#xff0c;前端框架的选择变得尤为重要。无论是构建小型应用&#xff0c;还是规划大型企业级项目&#xff0c;选择合适的前端框架能够极大地提升开发效率、维护性和可扩展性。本文将详细对比目前主流的四个前端框架&#xff1a;React、Vue.js、A…

python爬虫bs4库的用法

导入 导入bs4之前先装两个库&#xff0c;bs4和lxml pip install beautifulsoup4 pip install lxml lxml安装后可以显著提高执行速度。 导入bs4 from bs4 import BeautifulSoup解析字符串 BeautifulSoup()方法用于解析字符串&#xff0c;将字符串解析为soup对象&#xff0c;so…

进阶数据库系列(十三):PostgreSQL 分区分表

概述 在组件开发迭代的过程中&#xff0c;随着使用时间的增加&#xff0c;数据库中的数据量也不断增加&#xff0c;因此数据库查询越来越慢。 通常加速数据库的方法很多&#xff0c;如添加特定的索引&#xff0c;将日志目录换到单独的磁盘分区&#xff0c;调整数据库引擎的参…

c语言200例 066

大家好&#xff0c;欢迎来到无限大的频道 今天给大家带来的是c语言200例。 要求&#xff1a; 根据输入的职业表示&#xff0c;区分是老师还是学生&#xff0c;然后根据输入的信息&#xff0c;将对应的信息输出&#xff0c;如果是学生&#xff0c;则输出班级&#xff0c;如果是…

SpringCloud-07 GateWay01 网关技术

Spring Cloud Gateway组件的核心是一系列的过滤器&#xff0c;通过这些过滤器可以将客户端发送的请求转发(路由)到对应的微服务。 Spring Cloud Gateway是加在整个微服务最前沿的防火墙和代理器&#xff0c;隐藏微服务结点IP端口信息&#xff0c;从而加强安全保护。Spring Clou…

open-resty 服务安装jwt插件

作者&#xff1a;程序那点事儿 日期&#xff1a;2023/11/16 22:07 lua-resty-jwt 插件 如果想使用Lua识别用户令牌&#xff0c;我们需要引入lua-resty-jwt模块&#xff0c;是用于 ngx_lua 和 LuaJIT 的 Lua 实现库&#xff0c;在该模块能实现Jwt令牌生成、Jwt令牌校验。 下载…