拍拍贷鸿蒙版H5容器之路

背景介绍

业务背景

2024年1月18日华为宣布:HarmonyOS NEXT 将不再支持 Android系统,基于以上背景及国内信贷业务现状,公司决定启动借款App鸿蒙化项目。

下图是2024年6月华为HDC大会上,华为宣布 HarmonyOS NEXT 将面向开发者和先锋用户启动Beta升级,并计划在今年四季度正式商用。

技术背景

借款APP业务层约70%是基于H5页面构建的,经过多年的迭代,Android与iOS已经有一个非常稳定和强大的Web组件,即:PPDWebUI。为了避免业务层过多地适配,加快App鸿蒙化进程,在技术上只需要开发一个鸿蒙版的PPDWebUI,功能和Android、iOS保持一致,就可以承接已有业务。最终使得业务站点改动的成本最小,并且实现了三端技术架构的统一。

下面的内容主要是介绍我们实现PPDWebUI的方案和实现过程中遇到的困难与挑战。

方案设计

如上图,方案的思路是基于鸿蒙官方提供的ArkWeb进行封装,实现鸿蒙PPDWebUI组件

  • ArkWeb简介:鸿蒙官方提供的基于谷歌Chromium内核的Web组件,使用的Chromium版本为M114(截止本文编写时)

PPDWebUI组件分为两部分

  • Web容器,提供H5容器和原生服务
  • ppdwebui.js,负责JS与Native的通信,本质上是对JsBrdige的封装

PPDWebUI组件的Web容器

  • 原生和H5交互原理
  1. 使用JsBridge通信通过javaScriptProxy和runJavaScript来实现JsBridge。使用javaScriptProxy将原生侧接口注入到H5的window对象上,通过runJavaScript接口执行JS脚本到H5中,并在回调中获取脚本执行结果。
  • 调用流程如下图所示:

  •  代码示例:
Web({      src: this.url ?? '',      controller: this.webviewController      }).javaScriptProxy({      // 将对象注入到web      object: this.jsApi,      name: "_foo",      methodList: ["bar"],      controller: this.webviewController      }
  • 注入原生服务不采用开始加载页面的时候就注入原生服务的原因:
  • 减少不必要的注入,每次注入原生服务都需要依赖于站点应用引用的js。
  • 更安全可控,每次注入原生服务的时候都可以进行安全校验。通过ArkWeb中的onInterceptRequest方法拦截js替换本地WebUI.js,同时注入原生的插件方法名称,让其挂载在容器上,这样H5就可以调用原生方法,拦截注入代码如下:
onInterceptRequest(event?: InterceptEvent): WebResourceResponse | null {      let url: string = event?.request?.getRequestUrl() as string;      if (url.match(/^https?:\/\/xxx\.xxx\.com\/[\d.]+\/xxx\.js$/)) {        let webResp = new WebResourceResponse();        const resourceMgr: resourceManager.ResourceManager = this.context.resourceManager;        let js = buffer.from(resourceMgr.getRawFileContentSync('xxx1.0.js')).toString('utf-8')        let respData =          `${js};window.PPDWebUI && window.PPDWebUI.initJSConfig && window.PPDWebUI.initJSConfig(${this.appendJsStr})`        webResp.setResponseData(respData);        webResp.setResponseCode(200)        webResp.setResponseEncoding('utf-8')        webResp.setResponseMimeType('application/javascript')        webResp.setResponseIsReady(true)        return webResp      } else {        return null      }    }

  • PPDWebUI容器使用
  1. 容器初始化
// 页面即将显示的时候注册服务aboutToAppear(): void
 {  PPDWebUIInitManager.registerService(new LoanServiceCaller());}//自定义WebUI组件初始化WebUI({    webUrl: this.webUrl,    props: this.webuiPro,    webClient: new WebClientImp(getContext(this)),    webUIConfig: new WebUIConfig(this.appendUserAgent,true),    webUIHostController: this.webUIHostController})  .layoutWeight(1)  .width('100%')
  • H5业务的适配
    1. 升级WebUI.js:所有业务的H5页面均使用统一提供的PPDWebUI.js调用Native的原生能力,H5页面仅需要对 PPDWebUI.js 进行升级,即可以运行在鸿蒙系统上,无需其他特殊适配逻辑。
    2. 如有需要针对操作系统的特殊需求,页面可依据Native注入的系统信息来识别当前运行的操作系统,简单高效。

困难与挑战

下面列举了我们在实现鸿蒙版PPDWebUI组件时遇到的问题与解决方案,供大家参考

  1. H5页面与原生容器如何联调?
  • ArkWeb组件支持使用DevTools工具调试前端页面,开发者需通过setWebDebuggingAccess()接口开启Web组件前端页面调试能力,利用DevTools工具可以在电脑上调试移动设备上的前端网页
  • 使用DevTools工具,可以执行以下步骤:
  • 在应用代码中开启Web调试开关,具体如下:
aboutToAppear() {    // 配置Web开启调试模式    webview.WebviewController.setWebDebuggingAccess(true);  }  build() {    Column() {      Web({ src: 'www.example.com', controller: this.controller })    }  }}

开启调试功能需要在DevEco Studio应用工程hap模块的module.json5文件中增加如下权限,添加方法请参考在配置文件中声明权限。

"requestPermissions":[   {     "name" : "ohos.permission.INTERNET"   } ]

将设备连接上电脑,在电脑端配置端口映射,配置方法如下:

//查找 devtools 远程调试所需的 domain socket 名称,该名称与进程号有关,重启调试应用后,需要重复此步骤,以完成端口转发cat /proc/net/unix | grep devtools// 添加映射 [pid] 替换成实际的进程idhdc fport tcp:9222 localabstract:webview_devtools_remote_[pid]// 查看映射 hdc fport ls示例:hdc shellcat /proc/net/unix | grep devtoolsexithdc fport tcp:9222 localabstract:webview_devtools_remote_3458hdc fport ls

在电脑端Chrome浏览器地址栏中输入chrome://inspect/#devices,页面识别到设备后,就可以开始页面调试。调试效果如下:

2. 导航栏标题不显示或显示不对问题?

  • 通过H5容器的ArkWeb的原生onTitleReceive方法获取H5的docment.title,设置导航标题
  Web(...)   .onTitleReceive((event) => {        this.props.navTitle = event.title; })

  3. H5页面需支持侧滑返回上一次H5页面问题?

  • 通过H5容器的ArkWeb的原生onBackPressed方法监听返回键,拦截返回动作,实现H5页面的侧滑返回上一页。

  4. 同一个webview中,先打开A页面,然后setTimeout 2秒 后使用location.href跳转B页面。B页面没有触发webview的任何事件问题?

  • 原因是调用setCustomUserAgent后与web页面的跳转时序相关,Web跳转后才设置UserAgent,这就导致页面跳转了但新UserAgent关联的页面堆栈数仍只有一个WebView

  5. 多个JsBridge注入问题?

  • 无法使用 javaScriptProxy 方法注入多个 JsBridg对象,需要在生命周期方法 onControllerAttached() 中 调用 WebViewController 的 registerJavaScriptProxy() 方法注入 JsBridg对象
  Web(...)    .onControllerAttached(() => {    this.webviewController.registerJavaScriptProxy(...)      })

未来规划

  • 在业务迭代过程中,为进一步抹平三端差异,计划将Android/iOS离线包方案也移植到鸿蒙版借款App中,提升H5的用户体验
  • 性能优化,开发过程中,也面临ArkWeb加载和丢帧等问题,目前了解到DevEco Profiler提供ArkWeb分析模板,后面也会结合ArkWeb执行流程的关键trace点,来定位问题发生的阶段,并做一些针对性的性能优化
     

作者简介

Jsiguo,信也科技移动研发资深专家

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序服务通知

项目中用到了小程序的服务消息通知,通知订单状态信息,下边就是整理的一下代码,放到项目中,把项目的小程序appid和小程序的secret写进去,直接运行即可 提前申请好小程序服务信息通知短信模板,代码需要用到模…

3000字帮你彻底搞懂Java抽象类与接口的区别(含JDK8接口新增三种方法与丰富案例)

Java-OOP 1-Final 1.1简介 final关键字是最终的意思,可以修饰:类、方法、变量。 修饰类:该类被成为最终类,特点是不能被继承了。修饰方法:该方法被称为最终方法,特点是不能被重写了。修饰变量&#xff…

有没有噪音低的宠物空气净化器推荐?希喂、IAM性能PK

有一说一,随着清洁家电市场的不断发展,市面上的各种清洁家电品类也是越来越多,像是吸尘器、洗地机、扫地机等等这些产品估计大家都很熟悉了。 但!如果你家也跟我家一样也是养了几只猫猫狗狗,那你就会发现到&#xff0…

vscode摸鱼学习插件开发

不知道大家在摸鱼的时候,会不会想要学习? 或者有没有考公人,下班要学习的? 上班时间摸鱼,下班时间不够学习? 为此,我决定开发一个vscode插件,来刷粉笔题 粉笔插件名称:…

hive将包含逗号的字段拆分为多列

目录 一、概述 二、行动 1.准备数据 2.数据清洗 3.substring_index函数 4.split函数实现 一、概述 想将hive表中包含逗号的字段按逗号做分隔符进行分列操作 二、行动 1.准备数据 --1 select {1,2,3,4,5,6,7,8} as num_str --使用的数据2.数据清洗 --2 select num_s…

文心一言 VS 讯飞星火 VS chatgpt (381)-- 算法导论24.5 1题

一、给出图24-2的与图中两棵最短路径树不同的另外两棵最短路径树。如果要写代码,请用go语言。 文心一言: 在图论中,最短路径树(Shortest Path Tree, SPT)是一种从单个源点到所有其他节点的最短路径形成的树。给定一个…

故障诊断 | MTF-TLSSA-DarkNet-GRU-MSA迁移学习故障识别程序(t分布+莱维飞行改进麻雀优化)

故障诊断 | 故障诊断实例代码 目录 故障诊断 | 故障诊断实例代码效果一览基本介绍程序设计参考资料 效果一览 基本介绍 利用了迁移学习和多项技术改进,包括麻雀搜索法、DarkNet19、GRU、多头注意力机制等,以提高故障识别的准确性和效率 模型框架&#x…

在Bash脚本中 set -e 是什么意思

问题 我正在研究这个预安装(preinst)脚本的内容,该脚本会在从 Debian 软件包(.deb)文件解压该包之前执行。 脚本包含以下代码: #!/bin/bash set -e # Automatically added by dh_installinit if [ "$1" install ]; thenif [ -d /usr/share…

使用yolov3配置文件训练自己的数据

目录 前言 一、准备数据集 二、创建文件结构 三、格式化文件 1.data文件夹 2.config文件夹 四、修改yolo的配置文件 1.train文件 2.json2yolo文件 3.datasets文件 前言 使用yolov3框架训练自己的数据大致分为这四步: 准备数据集创建文件结构格式化文件 …

【小白学机器学习29】 概率统计与图形 ( hist, bar, pie , box ,scatter ,line)

目录 1 频度/次数 1.1 频度统计表:频度分布表 1.2 频数分布图直方图 histogram / hist 1.3 对比,柱状图 bar graph /column chart 2 饼图 pie chart 2.1饼图特点 3 南丁格尔玫瑰图 4 茎叶图 stem-and-leaf display 5 箱型图 box plot 6 …

springboot098基于web的网上摄影工作室的开发与实现(论文+源码)_kaic

网上摄影工作室 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了网上摄影工作室的开发全过程。通过分析网上摄影工作室管理的不足,创建了一个计算机管理网上摄影工作室的方案。文章介绍了网上摄影工…

【再谈设计模式】单例模式~唯一性的守护者

一、引言 在软件工程中,软件开发,设计模式是提高代码复用性和可维护性的有效工具。单例模式(Singleton Pattern)作为一种创建型设计模式,旨在确保一个类只有一个实例,并提供对该实例的全局访问。这一模式在…

UDP-鼠李糖合成酶基因的克隆与鉴定-文献精读76

何首乌中UDP-鼠李糖合成酶基因FmRHM1/2的克隆与鉴定 摘要 UDP-鼠李糖是一种由UDP-鼠李糖合酶(RHM)催化合成的鼠李糖供体,而鼠李糖是鼠李糖苷化合物的重要组成部分,植物中只有少数基因编码的酶参与UDP-鼠李糖生物合成。本研究基于…

创建多维数组的全部元素的索引np.indices

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 创建多维数组的 全部元素的索引 np.indices [太阳]选择题 根据题目代码,执行的结果是? import numpy as np arr np.arange(6).reshape((2, 3)) print(&quo…

C/C++ 矩阵的QR分解

#include <iostream> #include <vector> using namespace std;int main() /* 矩阵A的QR分解*/ {// 动态分配内存int m 3; // 行数int n 3; // 列数// 初始化矩阵Adouble A[3][3] {{1, 2, 2},{2, 1, 2},{1, 2, 1}};double R[3][3] { 0 };double Q[3][3] { 0 };…

2023-2024年教育教学改革、教学成果奖等项目申请书合集-最新出炉 附下载链接

2023-2024年教育教学改革、教学成果奖等项目申请书合集 下载链接-点它&#x1f449;&#x1f449;&#x1f449;&#xff1a;2023-2024年教育教学改革、教学成果奖等项目申请书合集-最新出炉.zip 资源介绍 本资源展示了2023-2024年高等教育领域的教育教学改革项目以及教学成…

某大型建设集团有限公司信息化技术方案(250页WORD)

方案介绍&#xff1a; 本信息化技术方案旨在构建一个集成度高、功能全面、操作简便的信息化系统&#xff0c;涵盖公司管理、业务运营、项目监控、数据分析等多个方面。通过引入云计算、大数据、物联网、人工智能等先进技术&#xff0c;实现资源的优化配置、流程的高效协同和数…

EDA --软件开发之路

之前一直在一家做数据处理的公司&#xff0c;从事c开发&#xff0c;公司业务稳定&#xff0c;项目有忙有闲&#xff0c;时而看下c&#xff0c;数据库&#xff0c;linux相关书籍&#xff0c;后面跳槽到了家eda公司&#xff0c;开始了一段eda开发之路。 eda 是 electric design …

Failed to install Visual Studio Code update

当关闭vsCode的时候&#xff0c;出现了下面的报错&#xff1a; 可能是之前将vscode文件换了位置导致的&#xff0c;并且vscode在桌面的图标也变成了下面这个&#xff1a; 解决方法&#xff1a; 找到上图路径的log文件并打开&#xff1a; 搜索电脑中的Code.exe文件 并粘贴到上…

神经网络进行波士顿房价预测

前言 前一阵学校有五一数模节校赛&#xff0c;和朋友一起参加做B题&#xff0c;波士顿房价预测&#xff0c;算是第一次自己动手实现一个简单的小网络吧&#xff0c;虽然很简单&#xff0c;但还是想记录一下。 题目介绍 波士顿住房数据由哈里森和鲁宾菲尔德于1978年Harrison …