前言
这个方案是提供类似小程序的能力,让App成为平台,使其他业务可以通过H5的形式为App赋能。
容器方案选用H5方式实现,搭建JS通信桥,H5通过通信桥与WKWebview进行通信。
App通过JS API为H5提供如文件上传下载,部分Native页面的路由支持(如扫码,聊天会话,个人详情),链接分享等功能。后端为业务方提供一套OpenAPI用于小程序信息与鉴权维护的。
前端架构设计
流程图
通信桥
Native Bridge
Native -> H5 的通信桥,用于维护客户端的通讯逻辑。
实现功能:
- JS端业务函数的注册与管理,如为H5提供扫码功能,应用内分享功能等。
- Native端向JS端注册常量,如Bridge的版本号,客户端的设备信息等。
- 提供Native端已注册函数的查询API。
- 使用callbakcId的方案管理JS端的异步回调。
通信流程:
- Native端通过Webview发起请求,调用js端的固定函数(如:FunJS),请求参数为字典类型,再将字典转为JSON String类型进行传输。请求参数中包含functionName,对应js端的注册函数,callbackId,用于管理JS端的回调。
- JS端接收到请求后,通过functionName调用指定函数,同时解析JSON String,带入请求参数。
- JS端在回调的时候会带上callbackId,Native通过Id匹配请求与回调。
JS Bridge
H5 -> Native 的通信桥,用于维护H5的通讯逻辑,与JS Bridge的功能相对应。
实现功能:
- JS端业务函数的注册与管理。
- 提供常量池,存放客户端注册的常量。
- 提供JS端已注册函数的查询API。
- 使用callbakcId的方案管理Native端的异步回调。
通信流程,基本和Native Bridge的逻辑相同:
- JS端调用Native端注册在Webview的通信函数(如:FunNative),请求参数为字典类型,再将字典转为JSON String类型进行传输。请求参数中包含functionName,对应Native端的注册函数,callbackId,用于管理Native端的回调。
- Native端接收到请求后,通过functionName解析出需要调用的函数。对请求进行白名单host校验(每个函数有独立的白名单),是否为已经注册的函数。
- 验证通过,解析JSON String中的请求参数,调用指定函数。
- 回调JS端,并带上callbackId,JS端通过Id匹配请求。
函数
JS Function Model
JS端的函数逻辑比较简单,只需要一个function name,一个handler即可创建一个函数,并且注册到bridge上。
Native Function Model
包含 函数名(function name),实现(handler),白名单(host white list),相关数据(userInfo)。
相比JS端,多了白名单功能。
公共函数(Public Function)
公共函数为统一注册,所有WebView均可使用,同时函数也会启用白名单验证。
- JS端配置Native导航栏:导航栏标题样式、导航栏左侧按钮与右侧按钮图片与样式,导航栏整体显示与隐藏。
- JS端控制Webview浏览栈回退。
- JS端控制Webview页面关闭。
- JS端新建Webview页面,并且打开新的链接。
- JS端刷新当前页面。
- JS端获得当前用户token
- JS端刷新用户token。
- JS端加载本地资源文件至WebView。
私有函数(Private Funcion)
在有限范围内提供能力,每个WebView需要单独注册才可被使用,WebView关闭后自动失效。
- JS端下载文件。
- JS端通过ID获取当前小程序信息。
容器配置(Configuration)
用于存放容器需要使用的相关信息,分别有:
- App原有导航栏样式(标题样式,导航栏背景色/背景图)。
- 容器当前导航栏样式。
- 导航栏左侧按钮、右侧按钮配置。
- 安全区域背景色配置。
- 返回按钮(样式,点击事件)。
关于导航栏样式的配置说明下,iOS的机制是同一个Navigation Controller中的View Controller会共用一个导航栏,如果JS端修改了导航栏配置,则会导致Native的其他页面导航栏也被修改。所以在容器退出时,需要将导航栏配置还原,避免对其他模块页面造成影响。
CookieManger
管理WebView的Cookie,支持对Cookie数据的CRUD,与WKHTTPCookieStore同步。
WebView Controller
主要负责管理WebView的生命周期,维护相关控件(比如网页加载进度条),UI相关的逻辑基本都放在这里,WebView加载相关逻辑都注册到Manager中。
WebView Manager
- 负责通信桥的注册(注册JS SDK,注册JS环境变量),通信桥的生命周期通知。
- WebView加载URL的策略(比如符合Native路由规则的url直接走路由逻辑)。
- 注册管理WKURLSchemeHandler来根据scheme来webView处理数据(比如加载离线资源包,H5获取本地图片二进制数据)。
- 维护Cookie同步。