目录后台界面格式离线资源打包格式离线资源投递离线资源缓存后台由于在线乐客客户端App第一次打开平台H5需要几秒加载,所以这个体验是对用户很重要不友好。为了让用户跳转到H5,跳转到和原来一样的用户体验,需要将H5相关的离线资源包发送给客户端,客户端可以使用离线资源,而不是实际的网络请求。节省用户等待时间和流量消耗。而且随着业务的发展,不同的业务升级进度也不一样,需要APP支持模块化升级。接口格式offlineResourceInfo接口请求方法:POSTofflineResourceInfo接口请求参数:Json格式:{//"appVersion":"2.4.0",可以去掉,因为请求头会包含"resourceversionList":[{"name":"m","version":"1.0.0"},{"name":"coach","version":"1.0.0"},{"name":"activity","version":"1.0.0"}]}Formform:resourceNames=m,coach,activity&resourceVersions=1.0.0,1.0.0,1.0.0offlineResourceInfo接口返回结构:{"data":{"resourceList":[{"name":"m","version":"1.0.1","url":"http://cdn.xxx.com/resource/m/m_update_1.0.0_1.0.1.zip","md5":"a4d7feecbcae8e2ccba3b5ba90aa8a83","isfull":false},{"name":"coach","version":"1.0.1","url":"http://cdn.xxx.com/resource/coach/coach_full_1.0.1.zip","md5":"a4d7feecbcae8e2ccba3b5ba90aa8a83","isfull":true}]}}参数说明:"name":模块名称"version":升级版本"url":资源包下载地址"md5":资源包md5"isfull":是否为完整升级包离线资源包格式增量和完整的升级包结构一样,包括config.json文件和资源文件config.json。config.json的格式如下。version记录分布式资源的版本号,validate记录所有文件的路径和对应的md5哈希值。{"version":"1.0.1","validate":[{"path":"528/app.min.cs","md5":"md5($cssFileContent)"},{"path":"528/app.min.js","md5":"md5($jsFileContent)"}]}具体资源和config.json同级。--[528]----app.min.css----app.min.jsofflineresourcedeliverytiming设置app启动时的timer定时器->wifi环境->请求server接口获取offlineResourceinfo接口响应,根据resourceList的结果决定是否更新,需要更新的模块可以根据模块目录下载zip文件资源包存放目录存放资源包。目录moduleszip用于存放压缩资源包的路径,目录modules用于存放解压后的压缩包路径。所以每次请求offlineResourceInfo接口时,还需要遍历所有模块目录下的config.json获取资源版本号。所以第一次请求,由于本地目录为空,所以接口offlineResourceInfo的参数resourceversionList也为空。--[offlineResource]----[moduleszip]-----[m]--------[zip]------------m.update.1.0.0_1。0.1.zip------------m.full.1.0.1.zip--------【temp】解压临时目录--------【backup】原资源备份目录------[coach]------[zip]----------coach.update.1.0.0_1.0.1.zip---------coach.full.1.0.1.zip------[temp]解压临时目录------[backup]原资源备份目录----[modules]------[m]--------config.json--------其他资源文件------【coach】--------config.json--------其他资源文件----[modulesflag]------[m]------flag.json------[coach]--------flag.json资源pack解压解压下载资源包时,解压前需要根据接口返回的md5值校验资源包的合法性。校验子文件的过程:需要结合config.json和resources来校验每个文件的合法性。如果不合法,则不会添加资源文件,也不会保留整个资源包。更新资源增量更新:文件替换和添加。并且您需要合并新旧config.json。完全更新:覆盖模块目录。更新模块资源包前,需要备份之前的模块资源。例如:将目录offlineResource/modules/m复制到目录offlineResource/moduleszip/m/backup中进行备份。容错处理需要设置flag并持久化到flag.json:{"doingUpgradeFlag":false,//false,说明升级过程正常,否则升级过程出错。"doingBackupFlag":false//false,表示备份过程正常,否则备份过程出错。}升级标志位(总标志位)备份标志位(被升级标志位的子集)升级过程包括,md5检查资源包,md5检查每个资源文件,备份和更新过程。如果在整个升级过程中出现常见错误,则恢复所有标志并结束升级过程。整个升级过程中如果出现crash或者进程被kill掉,App会重新启动。此时没有重置升级标志(升级失败),有以下几种情况需要容错:如果没有重置备份标志(备份失败),则目标模块的资源不会被此时受到影响,所有标志位将直接恢复。如果已经重置了备份标志(备份成功),首先清除目标模块资源,然后执行回滚操作:如果回滚成功,则直接重置所有标志。如果回滚失败,首先清除目标模块资源:如果正常失败,恢复所有标志。应用程序崩溃或进程被终止,无事可做。升级标志未重置时的容错副作用。此时App的webview请求不会经过缓存系统。否则Appwebview可以继续使用缓存系统。升级流程图离线资源缓存使用缓存时序只拦截以xxx.com为主域名的webview的请求,然后根据请求链接找到具体的文件缓存。查找具体文件缓存的方法:遍历所有模块下的config.json文件,看能否找到具体的资源文件。这样效率上会慢一些,但是更适合现有的场景。根据链接的一级路径找到对应模块下的config.json文件,看能不能找到具体的资源文件。这样效率会更高,但是目前链接的一级路径还不规范。直接根据请求URL的PATH查看本地是否存在特定的资源文件。PATH的一级路径代表模块名,其余部分代表资源路径。这里的app会使用第二种方式查找缓存文件,所以需要前端小伙伴规范一下链接路径。拿到缓存文件后,需要再次验证缓存文件的合法性。如果合法,则使用缓存。如果不合法,则需要进行如下容错处理。使用缓存容错处理。如果找到的缓存文件损坏或不存在(解压过程中断,进程被kill或crash),此时需要继续走网络,对网络结果进行md5校验。如果合法,则需要将结果保存到缓存系统中。如果不合法,则不予处理。
