sonic iOS端实现原理

Sonic主要实现思路

  1. 基于后端渲染直出的页面拆分成(模版)+(数据)=(网页)的模式,在不同场景下,针对(模版)和(数据)分别做更新;

主要功能模块构成

1.SonicSession

  1. 单个页面主资源加载所使用的会话,负责当次链接的完整状态流程。会在创建的sonic线程完成网络的加载。

2.SonicClient

  1. 负责管理所有的Session,通过传入Url,创建对应的session

3.SonicURLProtocol

  1. 负责拦截WebView产生的主资源请求,将SonicSession发起的网络流桥接给WebKit

4.SonicCache

  1. 负责为SonicSession提供缓存处理和缓存的返回,建立内存的缓存,会在这里做模板的更新与拆分。

5.SonicConnection

  1. 可以继承此基类,提供针对特定的URL完成所需的资源加载,比如离线资源,可以通过这个方式加载到WebKit

四大模式场景

1.首次加载

在首次加载页面的时候在未创建UIWebView之前建立起网络链接,等待UIWebView发起主资源请求到NSURLProtocol层完成拦截,并且将提前发起的数据流通过NSURLProtocol返回给WebKit,实现网络提前的并行加载;在网络流完成结束后,对网页数据进行正则匹配,拆分成模板和数据分别保存,保存成功后保存完整的html网页;iOS 终端实现原理 - 图1

2.局部刷新

有网页缓存情况下,二次进入打开页面前先载入完整的html页面缓存,并且在sonic线程发起请求获取可变的数据部分;在网络回包响应中通过template-change字段判定未发生模板更新,通过与上一次保存的(数据)部分与当次更新的(数据)部分进行对比更新;完成后与(模板)部分进行合并,拼接成新的html网页进行缓存;同时将数据的差异部分通过js回调传递给页面进行局部刷新;iOS 终端实现原理 - 图2

3.模版更新

有网页缓存情况下,二次进入打开页面前先载入完整的html页面缓存,并且在sonic线程发起请求获取可变的数据部分;在网络回包响应中通过template-change字段判定发生模板更新,这里旧的模板和数据已经无法使用,模板更新返回的是一个全新全量的html网页,对网页按照首次加载的模式进行处理,对网页数据进行正则匹配,拆分成模板和数据分别保存,保存成功后保存完整的html网页,然后通过session的回调让UIWebView重新发起一次请求,以便在NSURLProtocol层将新的网页数据返回给UIWebView展示出来;iOS 终端实现原理 - 图3

4.完全缓存

有网页缓存的情况下,二次进入打开页面前先载入完整的html页面缓存,收到页面响应为304,终端不需要任何动作,更新一下本次操作的响应时间参数。iOS 终端实现原理 - 图4