本文最后更新于 1 年前,文中所描述的信息可能已发生改变。
WebView

如何通信
通信实现两个基本能力:
- 应用侧调用js侧方法
- js侧调用应用侧方法

应用侧通过执行 runJavascriptExt,调用js侧的函数
js侧通过创建一个iframe,加载约定的url路径,会被应用侧webview组件拦截
这是一个循环:
- 应用侧执行注入的js代码(包含触发load的方法)
- js侧改变loadUrl
- 应用侧拦截到url,再次执行js侧代码,获取数据
- …loop
在实际情况中,会有相互回调通知的过程,将其抽取封装出来,就是jsBridge
jsBridge
基本构成

- globalStore 将一对一的jsBridge和webview实例存储起来,应用场景在跨页通知时,触发
send方法,将向所有的webview实例派发消息
应用侧:
- messageHandlers:存储通过registe方法注册的原生事件
- responseCallbacks:当应用侧调用前端成功后,如果有回调需求,将会以
[uId = callback]形式存储回调事件
前端:
- messageQueue:存储通知应用侧的消息
- messageHandlers:存储通过registe方法注册的js事件
- responseCallbacks:当前端调用应用侧成功后,如果有回调需求,将会以
[uId = callback]形式存储回调事件 - msgFromHom:供应用侧
runJavaScriptExt执行的方法
通信方法实现

应用侧:
- send:本质上是执行前端的一段js代码,传递json对象
- call:是对send传递对象的数据封装
- register:注册事件
前端:
- send:向消息队列存储一个事件对象
- call:对send传递对象的数据封装
- register:注册事件
前端最终的调用都是通过send向消息队列中存一个数据对象,然后更新iframe的url,触发webview拦截,应用侧再执行前端的
fetchQueue方法,获取消息
路由实现
路由有两种实现方式
- Router
- Navigation
区别

相比Router,Navigation
- [UIBuilder](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-builder-V5)

路由搭建
- 我们的页面始终依赖于webview组件,所以路由不能声明路由,只能选择动态路由
- 始终复用webview组件,但作为页面,需要和参数做映射
- 首页tab的缓存实现

路由实现结合router和navigation一起实现
- pages:约定两个entry路由(router),Login和Index页面,应用默认进入Index
- Index页面默认内置Tab组件,组件分别放置webview组件和需要的原生页面,tab可以实现页面的懒加载和缓存
- 为Index分配一个路由栈对象
- 每个页面都可以获取路由栈对象进行路由操作
- 如果跳转登录页直接通过Router跳转(为什么不用navigation?可以直接走Index完整的生命周期,而不是将特殊逻辑内嵌在Index中)