支付宝移动端 Hybrid 解决方案探索与实践

网友投稿 960 2022-11-17

支付宝移动端 Hybrid 解决方案探索与实践

支付宝移动端 Hybrid 解决方案探索与实践

支付宝 Hybrid 方案建设与演进

H5 容器

在支付宝中,HTML5 容器架构如图所示:

最上层是浏览器,这块就是大家常见的 Web 开发环境,包括 HTML、CSS、JavaScript等。H5 容器作为中间层,将浏览器和支付宝底层框架有机结合起来,在 H5 容器里面有 2 个非常重要的概念: JSBridge 和 离线包,后面会做详细介绍。支付宝底层框架会给 H5 容器提供 Native 的能力,这其中就包括 RPC(远程过程调用,用来实现 APP 和服务器通信)、支付、扫一扫等。

JSBridge

JSBridge 是 H5 容器的基石,桥接了 JS 环境与 Native,实现了 Native 代码和 浏览器 环境的双向通信,Native 代码可以通过调用 浏览器 提供的接口运行JS,从而实现调用 JS 函数、传递参数到 JS 环境等;而浏览器到JS环境的通信是通过 Native 拦截浏览器的请求来实现,请求可以是网络请求或者是一些内部函数的调用。

那么 JSBridge 会带来什么好处呢,在传统的 Web 开发场景,H5 页面会通过 HTTP 的 GET 或者 POST 请求到后台获取数据,就会用到 jQuery 等 AJAX 框架。但是 H5 页面中的 JS 函数公开的,没法做一些加密逻辑,同时对于无法优化网络。这几年随着 4G 和流量卡的普及,让手机网络变得更快、更便宜,在这之前大量用户会面临流量不足、信号差、网络不稳定的情况,这些场景在现在依然存在,而纯 Web 方案是没法提供相关的优化。

H5 容器提供的 JSBridge 解决了这个问题,所有 H5 页面需要从后台获取的数据都通过 JS Bridge 调用 Native 的 RPC SDK 来获取。这样实际 App 请求的数据都是由 RPC SDK 来发送,从而可以实现安全加密、签名校验、弱网优化、流量优化的功能。Native 层的这些功能是 Web 页面开发人员无感知的,所以业务开发人员只需要专注其自身的业务开发即可。安全性由支付宝底层 SDK 保障。

H5 容器提供了 2 种扩展方式:1. JSAPIJSAPI 方式给 H5 页面增加了 Native 功能调用接口,通过实现自定义 JSAPI 类中的 handler 方式,可以以 Native 的形式实现特定功能,例如调用 Native 加密函数。

2. 事件H5 容器在状态变化时会发送事件,通过监听 H5 容器特定事件,可以实现对 H5 容器生命周期的处理,比如修改加载进度条颜色、修改页面导航栏等。事件提供了更强的定制性,完全可以满足对 H5 容器的各种自定义需求。

H5 容器离线包

H5 容器离线包是 H5 容器用户体验的关键。在 APP 里面打开一个线上页面的时候,通常会有一个白屏的阶段,这是浏览器需要从服务器- HTML 资源。由于手机网络的限制,这个时间会很不确定,通常会花费 300ms 以上的时间,用户在这个时间里面就会看到页面白屏。

为了优化 H5 容器用户体验,减少白屏时间,支付宝在 H5 容器中引入了离线包技术。离线包可以简单理解为一个 zip 压缩包,其中包含前端页面所需的 HTML、CSS、JS、图片等资源。内置到客户端后,H5 容器打开离线包页面时会直接从离线包中获取资源,这个是毫秒的访问时间,消除了打开页面白屏现象。在支付宝中,离线包分为 2 种:普通的业务资源包和公共资源包。先说公共资源包吧,公共资源包中会包含一些框架 JS、CSS、常见图片等,这些资源在整个 App 里面就只保存一份;而业务资源包中只保存该业务所需的页面静态资源,业务之间是相互独立解耦的。这样一个业务的页面资源就会同时来自其业务资源包和公共资源包,公共资源包的存在优化了 App 大小。

为了满足快速发布的需求,H5 容器离线包提供了更新机制,以单个离线包作为更新维度。因为单个离线包业务很简单,所以离线包的大小是可控的,通常小于 500KB,这样单个离线包的更新时间可控,可以做到用户无感知。在一些极端网络场景下,新的业务资源包没有更新超过,而我们又期望用户使用的是最新的业务,这个时候 fallback 访问机制就会发挥作用。每个离线包资源都会在服务器存放一份,在刚刚说到的极端场景下,用户会访问服务器的 fallback 地址获取资源,从而保障页面可用。

结合前面说到的离线包后,整个 H5 容器渲染流程如下。其中离线包资源的更新、-对用户无感知,页面访问的资源是来自离线包还是来自 fallback 地址对前端是无感知的。

UC Webview 内核

为了提高 H5 容器稳定性,支付宝在安卓系统上使用了 UC Webview,UC Webview 的崩溃率和ANR率远低于系统浏览器,而且彻底规避了安卓系统 Webview 碎片化问题,相信做过安卓前端页面兼容的同学一定可以体会到使用一个浏览器内核的好处。

H5 容器作为一个成熟的 Hybrid 方案可以满足大部分的业务场景需求,但是其依然存在一些局限性。H5 容器的业务开发部分还保持着前端开发思维,毕竟整个过程都是使用的前端技术,只需要在业务开发完成后集成到 APP 中完成测试。但是客户端开发其中还有很多关键的概念,例如 iOS 的 ViewController 、Android 的 Activity 等,对客户端页面栈有清楚的了解更有助于开发 H5 容器。同时 H5 容器还存在一个致命的问题就是无法管控质量,宽泛的前端规范让管控变得异常困难。

JSON

axml

可以理解为小孩程序的页面 HTML,不支持直接操作 DOM 保障了页面逻辑的可控。

JS

用来描述代码逻辑,提供了 Page 中所需的各种生命周期,让开发者有APP 中的各种概念。

acss

Hybrid 方案借助移动开发平台 mPaaS 对外输出

从 0 开始开发一套 Hybrid 框架需要大量的人力以及反复的业务验证,对于大部分公司来说成本太高。而使用开源的 Hybrid 框架,例如 Cordova、Weex、React Native、Flutter等会面临一个非常致命的问题,就是遇到框架层的问题,很难获得及时有效的技术支持。目前支付宝的 Hybrid 方案已经借助移动开发平台 mPaaS 对外输出,解决前面提到的痛点,让你直接和支付宝使用同一套框架层代码,而且提供及时的技术支持。mPaaS 是一站式移动开发解决方案,提供了移动开发所需的 5 大组件:MGS、MDS、MPS、MAS、MSS,这些组件都是基于支付宝,经过实际业务考验。

获取 Demo 源码,进一步了解 mPaaS HTML5 容器&离线包特性和亮点。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:C# wpf入门实例2--属性标签赋值
下一篇:Docker部署
相关文章

 发表评论

暂时没有评论,来抢沙发吧~