x5内核 ajax base64,腾讯X5内核 WebView 实践篇
基于腾讯 X5 内核的WebView开发:
1.onPageFinished
2.onProgressChanged()
3.合适的时机获取页面元素
业务需求是在 html 中注入 js脚本实现阅读模式切换功能。但是基于开源项目 mozilla/readability 开发,项目脚本过长,如果不能选定合适的时机注入,那么势必会影响用户交互。
在实现需求阶段,实现方式是在 onPageFinished() 注入 js。注入代码完成之后,在页面 ready() 状态中主动去通知客户端当前页面内容加载完成,并且是否可以切换阅读模式。根据前端的状态返回来确定客户端的表现。当然,这个过程是缓慢的,所以不建议直接加载阅读模式的html 。
注入代码留存:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private void (X5WebView webView, String scriptFile){
InputStream input;
try {
input = getActivity().getAssets().open(scriptFile);
byte[] buffer = new byte[input.available()];
input.read(buffer);
input.close();
String encoded = Base64.encodeToString(buffer, Base64.NO_WRAP);
webView.loadUrl("javascript:(function() {" +
"var scriptElement = document.getElementById('readability-script');" +
//"alert(scriptElement);" +
"if(!scriptElement) {" +
"var parent = document.getElementsByTagName('head').item(0);" +
"var script = document.createElement('script');" +
"script.type = 'text/javascript';" +
// "script.async = 'true';" +
"script.id = 'readability-script';" +
// Tell the browser to BASE64-decode the string into your script !!!
"script.innerHTML = window.atob('" + encoded + "');" +
"parent.appendChild(script);}" +
"})()");
} catch (IOException e) {
e.printStackTrace();
}
}
在功能完成之后,我们发现,有的网页出现解析代码运行之后通知客户端是可读的,但是我们并不能获取到展示的文本信息。导致切换阅读模式出现空白页面的情况。
这个 Bug 目前还没有解决,规避方案是当前页面的检测结果为可切换阅读模式页面并且可阅读文本不为空时,我们才会通知客户端该页面支持阅读模式的状态。我们目前选择了规避。
在页面调试时发现,上述的script标签内容导入了两次,虽然能够正常运行,但是无疑是增加了WebView消耗。
经过排查发现,在新网页开启时,会立即调用onPageStarted()和onPageFinished()方法,这个时候会第一次注入js,当页面完全加载完,WebView还是会回调一次onPageFinished()方法。那么这就是第二次的注入时机。
上面的分析合情合理,但是真实原因并不是这个,因为我们发现在第一次onPageFinished()调用的时候,我们在注入js之后会去主动调用注入的一个方法,通过 chrome://inspect 调试发现,这个时候调用的方法是Undefined状态,所以说我们的注入是失败的。那么也就说明一个猜测,第一次回调onPageFinished()时,网页并没有完成html基本的格式加载。为什么在没有完成加载最基础的标签时,我们会收到onPageFinished()回调呢,这简直就是一个大坑,这个问题还没有深入研究,待后续再说吧。
排除了上述这个原因,那么为什么会出现js导入多次的情况呢?
由于本人并不了解前端开发,所以出现这个问题才知晓了单页面应用的概念,具体的可以自行了解单页应用程序。
在单页面应用中,页面跳转中 标签内容是一直存在的。在主页注入标签之后,在后续的onPageFinished()方法中重复导入。就会造成注入冗余的情况。
终于找到原因所在,那么上述的注入代码中,修改了js部分的代码,先去确定标签不存在再去注入。
总结:
单页面应用在跳转时只会刷新
内的信息,当然其他标签如果有更新也会变化,暂不考虑。而
x5内核 ajax base64,腾讯X5内核 WebView 实践篇相关推荐
- android x5 视频全屏,腾讯X5浏览器内核全屏播放视频相关问题
最近项目中接入了腾讯X5SDK用于展示H5与原生交互 有一个需求是在线播放H5中的视频且能全屏 原本是按照Demo中的代码写的.也没发现什么问题 但是发现一点击全屏播放的按钮 视频就卡死了. 网上搜了 ...
- Android 项目集成腾讯X5浏览器内核
1.为什么要集成腾讯 X5 浏览器内核 肯定是事出有因,简单来说,JS代码写的不标准,与部分机型内嵌套的浏览器内核产生矛盾,出现底层(os)bug导致,不得不费事搞一个其它内核进行加载网页,具体原因. ...
- 腾讯x5加载本地html乱码,腾讯X5内核播放器遇到的问题
最近在写一个和视频有关的项目,用到了腾讯x5内核的webview.利用webview调用本地js文件来播放视频.事情本身很顺利,但是在过程中遇到了一些小插曲,在此记录一下. 1.去除播放器中的广告 正 ...
- 移动web时代已开启:腾讯X5内核浏览服务
随着移动互联网的快速发展,手机浏览器市场也变得异常火爆.当HTML5从技术变成标准并逐步成为现实.浏览器厂商纷纷推出自主研发的内核,X5内核浏览便是其中的佼佼者. X5内核浏览服务是什么? X5内核浏 ...
- android 腾讯x5内核 浏览器
1.浏览器内核: 主流浏览器内核介绍(前端开发值得了解的浏览器内核历史) 浏览器内核历史介绍: 在android 4.4之前,浏览器用的还是webkit 在android 4.4之后,google就抛 ...
- Android的WebView如何播放视频和全屏视频(腾讯X5内核)
WebView如何播放视频和全屏视频 前言 1. 接入SDK 2. 具体场景和代码实现 3. 踩坑 3.1 android.system.ErrnoException: chmod failed: E ...
- 腾讯X5 浏览器内核加载
1.腾讯X5浏览器 sdk 官网 地址 腾讯浏览服务 2.腾讯X5 浏览器 sdk 加载 需要内存卡权限 加载成功率才高,因为有了内存读取权限,可以读取腾讯QQ 和微信的X5 内核,共用他们的内核,不 ...
- Android集成腾讯X5浏览器内核库
Android集成腾讯X5浏览器内核库 一.相关配置 1. 相关地址 2.引入SDK 3. AndroidManifest配置 二.Application中初始化内核 三.代码实现 1. 自定义带Pr ...
- Android 抛弃原生WebView,使用腾讯X5内核、并加入广告拦截。
大家都不知道原生的WebView 存在各种坑.各种适配问题. 最近在使用,总会出现DNS被拦截的情况.预览了各个大神的论坛与博客. 发现可以更改WebView内核.找到了比较火的两个. 分别是:腾讯X ...
最新文章
- java.lang.reflect.InvocationTargetException异常
- Python PIL反色混合
- 分享文章《控制情绪,享受人生》
- Windows7查看本地Java安装是否成功和路径的方法
- 调整linux系统时区
- netty的零拷贝、架构设计、ByteBuf扩容机制详解
- t–sql pl–sql_SQL Server处理器性能指标–第3部分–指示硬件组件问题的指标
- 20210119:力扣第42周双周赛(下)
- python main调试_在main.py中调试显示这个是什么问题
- python字典_Python字典
- VS2017超有用秘钥(亲测)
- 新库上线 | CnOpenData境外投资企业(机构)名录数据
- 神经网络模型结果怎么看,神经网络模型怎么预测
- 前缀列表ip prefix-list
- 手机QQ后台清理不掉的秘密——anddroid悬浮窗
- Mac重启Finder的技巧
- JAVA定义一个树形的结构_Java自定义树形结构
- 解决公司屏蔽上qq的方法
- WorldFirst靠谱吗?跨境收款工具万里汇WorldFirst介绍!
- 关闭Windows系统中的UAC用户帐户控制
热门文章
- 基于MVC模式下的二手车拍卖平台设计
- 两部鬼吹灯:一部拍出了电影效果,另一部却成了搞笑综艺
- 基于labview的心率测量系统设计(适用于其他串口通信的数据传输,改动一下程序即可)...
- 新手程序员未来发展计划
- 四十四、nimbus,supervisor进程自动停止(Read a frame size of ..., which is bigger than the maximum allowable...)
- docker 容器如何使用tini 作为启动进程并 清理、管理 Docker 容器僵死进程
- 【工作复盘】2020年9月3日 8月份工作复盘
- 机械臂手眼标定C++ opencv(眼在手上)
- 计算机系统集成管理技术资格证书,系统集成项目管理工程师证书查询网址是什么?怎么查询?...
- 活动模型与商品模型结合