Android 关于Tencent vConsole 添加入webView 总结

news2024/12/24 23:15:19

官方地址:

https://github.com/Tencent/vConsole/blob/dev/doc/tutorial_CN.md

上面文档中提供了两种常见的引入H5工程思路,简单易懂!

今天这篇文章要说明的是,不同于官方文档的接入方式。

先说背景:H5工程方,因框架原因不愿意或者不方便引入,这样就导致问题定位模糊,容易产生相互推诿的情况,那么作为app 客户端的我们又该如何应对呢?

思路:了解官方文档明白,本质就是引入一段js代码。那么为何不通过webView 直接注入。

不考虑兼容性的情况下(4.4以下),通过webVIew.evaluateJavascript的方法就可实现注入js。

实践1:网络cdn 引用 注入。

代码如下:

String injectScript = “(function() {” +
“function loadVConsole() {” +
" if (!window.vConsoleLoaded) {" +
" var script = document.createElement(‘script’);" +
" script.type = ‘text/javascript’;" +
" script.src = ‘https://unpkg.com/vconsole/dist/vconsole.min.js’;" +
" script.onload = function() {" +
" window.vConsoleLoaded = true;" +
" if (window.vConsoleLoaded && window.vConsoleInstance == null) {" +
" window.vConsoleInstance = new VConsole();" +
" }" +
" };" +
" document.head.appendChild(script);" +
" }" +
“}” +
“loadVConsole();” + // 调用函数来加载VConsole
“})();”;

binding.dwebVIew.evaluateJavascript(injectScript, null);

至此vConsole 就可以使用了。

然后又突发奇想,如果放到本地会不会更快?

所以出现了

实践2:本地assets 文件中的js引用 注入。

try {
if(TextUtils.isEmpty(vConsoleScript)) {
// 读取assets文件夹中的vconsole.min.js文件
InputStream inputStream = getAssets().open(“jsbrg/vconsole.min.js”);
int size = inputStream.available();
byte[] buffer = new byte[size];
inputStream.read(buffer);
inputStream.close();
vConsoleScript = new String(buffer, “UTF-8”);
}
// 构造注入到WebView中的JavaScript代码
if(TextUtils.isEmpty(injectScript)) {
injectScript = “(function() {” +
“function loadVConsole() {” +
" if (!window.vConsoleLoaded) {" +
" var script = document.createElement(‘script’);" +
" script.type = ‘text/javascript’;" +
" script.textContent = ‘" + escapeJavaScriptString(vConsoleScript) + "’;" +
" document.head.appendChild(script);" +
" window.vConsoleLoaded = true;" +
" if (window.vConsoleLoaded && !window.vConsoleInstance) {" +
" window.vConsoleInstance = new VConsole();" +
" }" +
" }" +
“}” +
“loadVConsole();” +
“})();”;
}
// 注入JavaScript代码到WebView中
binding.dwebVIew.evaluateJavascript(injectScript, null);

} catch (IOException e) {
e.printStackTrace();
}

其中遇到两个坑:

1、从assets文件夹中读取,注意路径一定得有,否则会io异常

2、上述方法有个关键方法,字符转义方法,加载的字符串无法直接注入,所以没这个方法无法注入成功,如下:

public static String escapeJavaScriptString(String input) {
if (input == null || input.isEmpty()) {
return “”;
}
StringBuilder sb = new StringBuilder(input.length());
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
switch © {
case ‘\’:
sb.append(“\\”);
break;
case ‘’‘:
sb.append("\’“);
break;
case '”':
sb.append(“\”“);
break;
case ’
':
sb.append(”\r");
break;
case ’
':
sb.append("
“);
break;
case ’ ':
sb.append(”\f");
break;
case ‘’:
sb.append(“\b”);
break;
case ’ ':
sb.append(“\t”);
break;
// 对于其他需要转义的字符,如 <, >, &, 也可以在这里添加
// 但通常这些字符在 JavaScript 字符串中不需要转义,除非它们被嵌入到 HTML 中
default:
// 对于 ASCII 范围内的字符,通常不需要转义
// 但对于非打印字符或特殊 Unicode 字符,你可能需要添加额外的逻辑
if ((c >= 0x20 && c <= 0x7E) || Character.isISOControl©) {
sb.append©;
} else {
sb.append©;
}
}
}
return sb.toString();
}

以上就是两种不同官方添加vConsole的方法,本质都是通过安卓 webView的动态注入js方法。

实践2:确实更快一些,个人感觉!免去了网络延时,多了本地处理时间,大家可以对比一下

看到最后,恭喜你获得,踩坑经历大礼包:

注入的时机选择:

1、onPageFinished

2、onPageStarted

3、onProgressChanged

经过我的实践:我这边认为最好的注入时机,这个三个地方都加上,onProgressChanged 方法中进度超过35%时开始注入。由于在注入代码中有添加是否注入过的逻辑,所以不用担心重复注入。

onPageStarted 这里添加是为了能尽可能的快注入成功,可能尽可能多的获取日志。

onPageFinished 这里添加是,前两处注入都失败了,有个保底方案。

看到这里,缺点也非常明显,日志是否能打印全,取决于注入成功的时间。所以会损失部分初始日志,但我测试也是偶发情况。

到此分享结束,我也是迫于无奈才出此下策,有更好的办法,欢迎分享。最后的最后希望大家不会用到这种方法,尽量让前端同学自己添加

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

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

相关文章

sentinel学习笔记6-限流降级(上)

本文属于sentinel学习笔记系列。网上看到吴就业老师的专栏&#xff0c;写的好值得推荐&#xff0c;我整理的有所删减&#xff0c;推荐看原文。 https://blog.csdn.net/baidu_28523317/category_10400605.html sentinel 实现限流降级、熔断降级、黑白名单限流降级、系统自适应…

使用 UniApp 在微信小程序中实现 SSE 流式响应

概述 服务端发送事件&#xff08;Server-Sent Events, SSE&#xff09;是一种允许服务器向客户端推送实时更新的技术。SSE 提供了一种单向的通信通道&#xff0c;服务器可以持续地向客户端发送数据&#xff0c;而不需要客户端频繁发起请求。这对于需要实时更新的应用场景非常有…

监控易在汽车制造行业信息化运维中的应用案例

引言 随着汽车制造行业的数字化转型不断深入&#xff0c;信息化类IT软硬件设备的运行状态监控、故障告警、报表报告以及网络运行状态监控等成为了企业运维管理的关键环节。监控易作为一款全面、高效的信息化运维管理工具&#xff0c;在汽车制造行业中发挥着重要作用。本文将结合…

Unity DOTS中的share component

Unity DOTS中的share component 内存管理创建流程修改流程销毁流程Reference share component是DOTS中一类比较特殊的component&#xff0c;顾名思义&#xff0c;它是全局共享的component&#xff0c;所有具有相同component值的entity&#xff0c;共享一个component&#xff0c…

外连接转AntiJoin的应用场景与限制条件 | OceanBase SQL 查询改写系列

在《SQL 改写系列&#xff1a;外连接转内连接的常见场景与错误》一文中&#xff0c;我们了解到谓词条件可以过滤掉连接结果中的 null 情形的&#xff0c;将外连接转化为内连接的做法是可行的&#xff0c;正如图1中路径(a)所示。此时&#xff0c;敏锐的你或许会进一步思考&#…

Facebook的去中心化探索:社交平台的新型发展趋势

随着数字化进程的加速&#xff0c;社交平台的架构正在经历一场深刻的变革。从最初的集中的社交网络到如今去中心化的构想&#xff0c;社交平台正在朝着更加透明、开放和用户主导的方向发展。作为全球最大的社交平台之一&#xff0c;Facebook&#xff08;现Meta&#xff09;也在…

Facebook 与数字社交的未来走向

随着数字技术的飞速发展&#xff0c;社交平台的角色和形式也在不断演变。作为全球最大社交平台之一&#xff0c;Facebook&#xff08;现Meta&#xff09;在推动数字社交的进程中扮演了至关重要的角色。然而&#xff0c;随着互联网的去中心化趋势和新技术的崛起&#xff0c;Face…

LeetCode:222.完全二叉树节点的数量

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;222.完全二叉树节点的数量 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二…

python+opencv+棋盘格实现相机标定及相对位姿估计

pythonopencv棋盘格实现相机标定及相对位姿估计 引言1&#xff0c;使用相机采集含棋盘格图像14张2&#xff0c;进行相机标定&#xff08;1&#xff09;测试软件1标定结果&#xff08;内参及畸变系数&#xff09;&#xff08;2&#xff09;测试软件2标定结果&#xff08;内参及畸…

Vue(四)

1.Vuex 1.1 Vuex是什么 Vuex 是一个插件&#xff0c;可以帮我们管理 Vue 通用的数据。例如&#xff1a;购物车数据、个人信息数据。 1.2 vuex的使用 1.安装 vuex 安装 vuex 与 vue-router 类似&#xff0c;vuex 是一个独立存在的插件&#xff0c;如果脚手架初始化没有选 v…

ShardingSphere-Proxy 连接实战:从 Golang 原生 SQL 到 GORM 的应用

在这篇文章《ShardingSphereProxy:快速入门》中&#xff0c;我们介绍了如何通过 Navicat 连接 ShardingSphere-Proxy。 实际上&#xff0c;ShardingSphere-Proxy 兼容标准的 SQL 和原生数据库协议&#xff0c;因此你可以使用任何 MySQL 客户端与其进行连接&#xff0c;包括 Go…

芝法酱学习笔记(2.2)——sql性能优化2

一、前言 在上一节中&#xff0c;我们使用实验的方式&#xff0c;验证了销售单报表的一些sql性能优化的猜想。但实验结果出乎我们的意料&#xff0c;首先是时间查询使用char和datetime相比&#xff0c;char可能更快&#xff0c;使用bigint&#xff08;转为秒&#xff09;和cha…

IntelliJ IDEA 快捷键大全:提升开发效率的利器

目录 一、基础快捷键 1. 文件操作快捷键 2. 编辑&#xff08;Editing&#xff09; 2.1 代码补全与导航 2.2 代码编辑 2.3 代码折叠与展开 3. 查找与替换 4. 调试 5. 版本控制 高级快捷键 重构快捷键&#xff1a;让代码更加优雅 导航快捷键&#xff1a;快速定位代码 …

基于Qlearning强化学习的机器人路线规划matlab仿真

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 训练过程 测试结果 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论…

LINUX--shell

函数 格式&#xff1a; func() { command } function 关键字可写&#xff0c;也可不写。 示例 1&#xff1a; #!/bin/bash func() { #定义函数 echo "Hello $1" } func world #执行主文件 # bash test.sh Hello world 数组 数组是相…

第22天:信息收集-Web应用各语言框架安全组件联动系统数据特征人工分析识别项目

#知识点 1、信息收集-Web应用-开发框架-识别安全 2、信息收集-Web应用-安全组件-特征分析 一、ICO图标&#xff1a; 1、某个应用系统的标示&#xff0c;如若依系统有自己特点的图标&#xff1b;一旦该系统出问题&#xff0c;使用该系统的网站都会受到影响&#xff1b; 2、某个公…

Linux驱动开发 IIC I2C驱动 编写APP访问EEPROM AT24C02

在嵌入式开发中&#xff0c;I2C&#xff08;Inter-Integrated Circuit&#xff09;是一种常用的串行通信协议&#xff0c;广泛应用于与外设&#xff08;如 EEPROM、传感器、显示屏等&#xff09;进行数据交换。AT24C02 是一种常见的 I2C EEPROM 存储器&#xff0c;它提供 2Kbit…

upload-labs-master第21关超详细教程

目录 环境配置解题思路利用漏洞 操作演示 环境配置 需要的东西 phpstudy-2018 链接&#xff1a; phpstudy-2018 提取码&#xff1a;0278 32 位 vc 9 和 11 运行库 链接&#xff1a; 运行库 提取码&#xff1a;0278 upload-labs-master 靶场 链接&#xff1a; upload-lasb-ma…

Redis篇--常见问题篇7--缓存一致性2(分布式事务框架Seata)

1、概述 在传统的单体应用中&#xff0c;事务管理相对简单&#xff0c;通常使用数据库的本地事务&#xff08;如MySQL的BEGIN和COMMIT&#xff09;来保证数据的一致性。然而&#xff0c;在微服务架构中&#xff0c;由于每个服务都有自己的数据库&#xff0c;跨服务的事务管理变…

概率论得学习和整理32: 用EXCEL描述正态分布,用δ求累计概率,以及已知概率求X的区间

目录 1 正态分布相关 2 正态分布的函数和曲线 2.1 正态分布的函数值&#xff0c;用norm.dist() 函数求 2.2 正态分布的pdf 和 cdf 2.3 正态分布的图形随着u 和 δ^2的变化 3 正态分布最重要的3δ原则 3.0 注意&#xff0c;这里说的概率一定是累计概率CDF&#xff0c;而…