作者:大头莎LALA | 来源:互联网 | 2023-09-09 11:42
目次背景接口花样离线资本包花样离线资本下发离线资本缓存背景由于线上乐刻客户端App第一次翻开平台H5须要几秒的加载时刻,这个体验对用户来讲并不友爱,为了让用户跳转H5和跳转到原生一
目次
背景
接口花样
离线资本包花样
离线资本下发
离线资本缓存
背景
由于线上乐刻客户端 App
第一次翻开平台 H5
须要几秒的加载时刻,这个体验对用户来讲并不友爱,为了让用户跳转 H5
和跳转到原生一样的用户体验,就须要把 H5
相干的离线资本包下发给客户端,客户端就能够运用离线资本来替代现实收集要求,节约用户等待时刻和流量斲丧。而且跟着营业的生长,差别的营业晋级进度不一样,就须要 App
支撑模块化晋级。
接口花样
offlineResourceInfo
接口要求要领: POST
offlineResourceInfo
接口要求参数:
Json 情势:
{
//"appVersion": "2.4.0", 能够去掉,由于要求头会包含
"resourceversionList": [{
"name": "m",
"version": "1.0.0"
},{
"name": "coach",
"version": "1.0.0"
},{
"name": "activity",
"version": "1.0.0"
}]
}
Form 表单情势:
resourceNames=m,coach,activity&resourceVersiOns=1.0.0,1.0.0,1.0.0
offlineResourceInfo
接口返回构造体:
{
"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
花样以下,version
纪录的是下发的资本版本号,validate
纪录的是一切文件的路劲和响应的 md5 hash
值。
{
"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.js
离线资本下发
下发机遇
App
启动时设置定时器定时器-> wifi
环境下 -> 要求服务器接口猎取 offlineResourceinfo
接口 response
,依据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
资本包解压
解压
当下载完资本包,解压之前须要依据接口返回的 md5
值来校验资本包的正当性。
校验子文件历程:须要连系 config.json
和资本来校验每一个文件的正当性,假如不正当,就不增添该资本文件 就不保存全部资本包。
更新资本
增量更新:文件的替代和增添。而且须要兼并新老 config.json
。
全量更新:掩盖模块目次。
模块资本包更新之前,须要先备份之前的模块资本。比方:拷贝目次 offlineResource/modules/m
到目次offlineResource/moduleszip/m/backup
来举行备份。
容错处置惩罚
须要设置标志位,并耐久化到 flag.json
:
{
"doingUpgradeFlag": false, // false, 示意晋级历程一般,不然晋级历程有毛病。
"doingBackupFlag": false // false, 示意备份历程一般,不然备份历程有毛病。
}
正在晋级标志位 (总标志位)
正在备份标志位 (是正在晋级标志位的一个子集)
正在晋级的历程包含, md5
校验资本包,md5
校验每一个资本文件,备份和更新历程。
假如全部晋级历程当中发作一般毛病,恢复一切标志位,然后完毕晋级流程。
假如全部晋级历程当中发作崩溃或许被杀掉历程,App 再次启动后。此时 正在晋级标志位
没有复位 (晋级失利),有以下几种状况须要做容错处置惩罚:
假如 正在备份标志位
也没有复位 (备份失利),此时并不会影响目的模块资本,直接恢复一切标志位。
假如 正在备份标志位
已复位 (备份胜利),先清空目的模块资本,然后做回滚操纵:
回滚胜利,直接复位一切标志位。
回滚失利,先清空目的模块资本:
一般失利,恢复一切标志位。
App 崩溃或被杀掉历程,Nothing To Do.
容错副作用
当 正在晋级标志位
没有复位时。此时 App webview
要求不走缓存体系。
不然 App webview
能够继承运用缓存体系。
晋级流程图
离线资本缓存
运用缓存机遇
只针对 webview
的以 xxx.com
为主域名的要求举行阻拦,然后依据要求链接,找到详细文件缓存。
找详细文件缓存的体式格局:
遍历一切模块下的 config.json
文件,看可否找到详细的资本文件。如许效力会比较慢,然则更适合现有的场景。
依据链接的一级途径找到对应模块下的 config.json
文件,看可否找到详细的资本文件。如许效力会比较高,然则现在链接的一级途径并不范例。
直接依据要求 URL
的 PATH
去当地查找是不是存在详细的资本文件。PATH
的一级途径代表模块名,盈余部份代表资本途径。
App 这里会运用第二种体式格局去找缓存文件,如许的话就须要前端小伙伴范例链接途径。
拿到缓存文件以后,须要再次校验缓存文件的正当性,合轨则运用缓存,不正当就须要下面的容错处置惩罚。
运用缓存容错处置惩罚
假如找到的缓存文件已破坏或许不存在(解压历程被中缀,杀掉历程或许 crash
),此时须要继承走收集,而且把收集效果举行 md5
校验,假如正当,须要把该效果保存到缓存体系,假如不正当,不做处置惩罚。