热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HybirdApp离线缓存体系

目次背景接口花样离线资本包花样离线资本下发离线资本缓存背景由于线上乐刻客户端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 再次启动后。此时 正在晋级标志位 没有复位 (晋级失利),有以下几种状况须要做容错处置惩罚:

  1. 假如 正在备份标志位 也没有复位 (备份失利),此时并不会影响目的模块资本,直接恢复一切标志位。

  2. 假如 正在备份标志位 已复位 (备份胜利),先清空目的模块资本,然后做回滚操纵:

    • 回滚胜利,直接复位一切标志位。

    • 回滚失利,先清空目的模块资本:

      1. 一般失利,恢复一切标志位。

      2. App 崩溃或被杀掉历程,Nothing To Do.

容错副作用

正在晋级标志位 没有复位时。此时 App webview 要求不走缓存体系。
不然 App webview 能够继承运用缓存体系。

晋级流程图

《Hybird-App离线缓存体系》

离线资本缓存

运用缓存机遇

只针对 webview 的以 xxx.com 为主域名的要求举行阻拦,然后依据要求链接,找到详细文件缓存。

找详细文件缓存的体式格局:

  • 遍历一切模块下的 config.json 文件,看可否找到详细的资本文件。如许效力会比较慢,然则更适合现有的场景。

  • 依据链接的一级途径找到对应模块下的 config.json 文件,看可否找到详细的资本文件。如许效力会比较高,然则现在链接的一级途径并不范例。

  • 直接依据要求 URLPATH 去当地查找是不是存在详细的资本文件。PATH 的一级途径代表模块名,盈余部份代表资本途径。

App 这里会运用第二种体式格局去找缓存文件,如许的话就须要前端小伙伴范例链接途径。

拿到缓存文件以后,须要再次校验缓存文件的正当性,合轨则运用缓存,不正当就须要下面的容错处置惩罚。

运用缓存容错处置惩罚

假如找到的缓存文件已破坏或许不存在(解压历程被中缀,杀掉历程或许 crash),此时须要继承走收集,而且把收集效果举行 md5 校验,假如正当,须要把该效果保存到缓存体系,假如不正当,不做处置惩罚。


推荐阅读
author-avatar
大头莎LALA
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有