Nebula

离线包

离线包是一个加签的压缩文件,其包含了 HTML 资源和 Javascript 代码供 H5 容器加载,使其内容能在 WebView 内渲染。离线包的类型有两种,一种是全局离线包,它包含公共的资源可供多个应用共同使用。另一种是私有离线包,它只可以被某个应用单独使用。

offline-package-structure

当 H5 容器发出资源请求时,其访问本地资源或线上资源所使用的 URL 是一样的。该请求会先被 H5 容器截获,如果本地有资源可以满足该请求的话,本地资源将被 H5 容器所使用,否则将使用线上资源。所以无论资源是在本地或者是线上,WebView 是无感知的。

当离线包被下载和存储在设备后,会按需载入内存中,在载入内存之前会对离线包进行一次验签来确保数据的完整性。另外,离线包当内容不会被解压,这样就可以避免为每一个文件进行验签的必要性。如果离线包验签结果通过,其内容会以 Map 的形式存储在内存中,Map 的 key 是对应资源的 URL, value 是资源的字元数组。

offline-package-in-memory

使用离线包的好处

  • 我们可以用离线包把内容嵌入应用中发布出去,这样当用户第一次开启应用的时候就不需要从线上下载内容,用户可以马上开始使用应用。这种做法可以提高用户体验。
  • 当有新版要推出或要做紧急发布的时候,我们可以把修改放在离线包里,通过更新配置来让应用自动下载更新。这种做法无需通过应用商店审核,就能让用户在第一时间收到更新。

使用离线包

offline-package

如上图所示,H5 容器将先尝试加载全局离线包和私有离线包,如果下载或验签失败,便加载线上版本兜底。最终内容会交由 WebView 中渲染。