完整实现版本
背景
webview离线包方案简单来说,是解决性能问题,提升hybrid页面可用性。
核心思路为:

  • 客户端提前下载好HTML模板
  • 用户产生交互时候,由客户端完成数据请求并渲染HTML
  • 交给WebView容器加载 目标
  1. 实现H5动态更新方案
  2. 更好的webview渲染加载性能
    离线包发布
  • CI/CD完成,打包zip包,推送到离线包平台
    查询离线包
  1. 提供HTTP服务,客户端需要接口查询离线包状态,每次应用启动查询,获取各个业务线离线包最新版
    获取离线包
  2. 提供HTTP服务用来提供离线包资源下载
  3. 启动App下载离线资源
  4. 下发方式
  5. 增量下发,即每次仅下发差异部分资源
  6. 随版本下发,即每次打包全量资源下发

构建能力

  • 客户端请求模式,由客户端根据json文件发起网络请求
    // 一个描述这个离线包的 json 文件 appConfig.json
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    {
    // 应用id
    "appid": XXX,
    // 应用名称
    "name":"template1",
    // 版本号
    "version": "2020.1204.162513",
    // 作者
    "author": "xxxx",
    // 描述
    "description": "XXX页面",
    //
    "check_integrity": true,

    "home": "https://www.XXX.com/XXX",

    "host": {"online":"XXX.com"},

    "scheme": {"android":{"online":"https"},

    "iOS":{"online":"resource"}},
    // 需要的离线包资源,由webpack打包实现
    "expectedFiles":["1.js","2.js","1.css","2.css","index.html"],

    "created_time":1607070313,

    "sdk_min":"1.0.0",

    "sdk_max":"2.0.0",
    // 数据接口位置
    "dataApi": ["xxxx"]

    }
    可用性和命中率
    有可能下载、解压过程中出现错误导致不可用等异常处理
  • 重试机制与定时轮询
    • 网络条件允许,每间隔15s重试一次,重试5次
    • 服务端推送离线包
  • 离线包完整性校验
    • 防止运营商劫持等,接口下发文件签名
    • 离线包下载完成客户端进行签名校验
      安全性
  • 灰度发布
    • 可以由接口返回走线上还是离线包概率控制
  • 回退机制
    • 切换到稳定版本(版本回退)
    • 回退到线上模式
      一般常见问题
  • 离线包解压缩失败;
  • 离线包服务平台接口超时;
  • 使用增量 diff 时,资源合并失败;