【点赞收藏加关注,前端技术不迷路~】
一、理论分析
1.技术背景:
使用uni-app创建的跨平台应用,覆盖h5、android、ios、及其热更新wgt。基础的热更新解决方案更新类型仅有两种,强制更新和不强制更新,更新机制简陋,现需要在原更新实现的基础上,重构更新策略,优化更新机制
2.痛点:
1)无法扩版本更新,若连发两版,高版本的不强制更新如果关掉,则低版本的强制更新也不会更新,
2)更新页面交互不友好,更新频繁,等待时间过长。
3)登录页面不检查更新,导致涉及到登录页面的改造更新异常,
4)老版本缓存的大数据(如各类操作员列表),即使新版本页面更换了查询接口,关键字不变的情况下也不会重新查询…
3.解决方案:
1)后端接口返回可更新版本数组,解决多版本更新的问题,
2)更新类型增加静默更新,解决资源包后台下载的问题,
3)更新页面优化,将更新过程转化成初始化过程,降低用户期待,缩短等待时长体感,
4)增加清除环境配置,清除缓存数据,来处理老版本遗留问题
4.实现思路:
丰富版本信息,传参控制具体动作,分离下载、安装动作,供静默更新使用
二、具体实现
1.访问路径是否匹配检查
检查当前环境中WEBURL环境参数,如果storage中记录的webUrl值与更新后的环境地址值匹配则不处理,
否则:
1.如果WEBURL.type不属于dev、test、pre或prod,则重置成prod
2.重置Vue.prototype.ENV为当前WEBURL.type,WEBURL.webUrl为当前版本环境配置中对应的值
3.如果重置了WEBURL.type,则需要切换到当前环境下的最新更新包checkUpdate(false,true,true)
4.如果没有重置,当需要登出的时候,需要执行登出操作
uni.removeStorageSync('USER_DATA);
uni.removeStorageSync('mes-token);
clearAllCookie();
uni.reLaunch({
url:"/pages/login/login"
});
* 每次进入首页、登录页均需检查,如不匹配需要重置处理
2.切换环境同步切换版本(开发、测试、预生产、正式环境切换)
因版本更新基本原则是只可升不可降,所以当在登录页切换环境时,需要切换到目标环境下的最新版本,来保证各环境的正常运转。当查询最新版本接口,传入的当前版本为空或不传时,后台只需要返回最新的版本即可。
3.更新检查
在检查app无更新后,检查是否有wgt版本更新:
1) 传入当前版本,后台按照逻辑,返回目前可以更新的版本,具体规则如下:
1.所有可更新版本均须高于当前版本,
2.强制更新版本:版本最高的更新类型为强制更新的版本只能有0或1个
3.不强制更新版本:版本最高的更新类型为不强制更新,且版本高于【2】的版本,只能有0或1个,
4.静默次更新版本:版本最高的更新类型为静默次更新,且版本高于【2】的版本,只能有0或1个,
5.返回结果为数组,按照版本从高到低排列
6.版本信息包括:版本主信息+是否清除环境配置:上一个可更新版本到本版本的字段汇总(有一个版本是1,值就是1)+清除缓存关键字:上一个可更新版本到本版本的字段汇总(值拼接,用逗号分割)+历史版本更新内容:当前版本到本版本的更新说明汇总(为各版本号和对应更新说明的对象的数组)
2) 若当前版本为空,或者不传,则直接返回当前环境的最新版本
3) 如果已忽略版本包含本次不强制更新版本号,则直接舍弃不强制更新版本
4.确定具体更新版本
具体更新版本包括3个:基础版本,可选版本,次更新版本
wgt版本更新检查接口返回的结果,若有已缓存版本,需要进行以下过滤:
1.如果有最强更新版本,最强更新版本和已缓存版本哪个版本更高,哪个版本就为基础版本,舍弃另一个较低的版本
2.如果没有最强更新版本,则直接设置已缓存版本为基础版本
3.如果有不强制更新版本,且版本大于已缓存版本,则保留不强制更新版本为可选版本,否则可选版本为空
4.如果有静默次更新版本,且版本大于已缓存版本,则保留静默次更新版本为次更新版本
如果具体更新版本只有一个次更新版本,则直接开启次更新静默下载,并退出更新流程
如果具体更新版本基础版本和可选版本至少有一个不为空,则跳转至标准更新流程
5.标准更新流程
如果有可选版本,则弹框供用户选择是更新可选版本,还是忽略可选版本
选择更新可选版本:开启更新可选更新版本流程:
忽略可选版本:将可选版本版本号存入已忽略版本缓存,若有基础版本则更新基础版本,若无,且没有次更新版本则退出更新流程;若有次更新版本,则开启次更新缓存流程,然后退出更新流程。
6.更新流程优化
弱化更新概念,改为获取补丁、初始化信息、环境配置、即将完成等阶段,降低每一个阶段的响应时间,来提高用户的容忍度
7.滞后处理
标准版本更新后:
若所更新版本是否清除环境配置为1,则设置WEBURL中的webUrl为null
uni.setStorageSync(VEBURL',{type:weburl_data.type;
若清除缓存关键字不为空,则按逗号分割,然后逐个删除缓存:
uni.removeStorageSync(dataKey);
如果有静默次更新版本,则开启次更新缓存流程,然后退出更新流程
三、热更新流程图
四、代码实现
具体实现代码有待梳理,择日补上,感兴趣的筒子们先收藏哈~
具体代码已经补上了哈,感兴趣的筒子们请移步:

1万+

被折叠的 条评论
为什么被折叠?



