因为项目需求需要在本地缓存html页面,优化用户体验。了解到VasSonic。百度了下源码解析但是没有发现IOS的所以只有自己慢慢摸索了。
一、类的简单关系
最终返回数据在 SonicSession 中做缓存处理。
缓存数据模板:
二、简单流程
1、在自定义WEB控制器中 启动引擎类 SonicEngine类 通过
- (void)createSessionWithUrl:(NSString *)url withWebDelegate:(id<SonicSessionDelegate>)aWebDelegate方法 创建 SonicSession 类。
2、SonicSession类初始化的同时生成url 的 MD5串SessionID
_sessionID = [sonicSessionID(aUrl)copy]; //SessionID
调用 - (void)setupData 方法 在SonicCache(缓存)中找 sessionID 对应的 URL。首先在 内存中找。如果没有就去本地document中找。
在Document中查找是需要满足 xxx.html、xxx.rsp、xxx.temp 都能对应上 xxx =sessionID,才表示找到缓存。大家可以看到缓存数据模板中有4个文件。比较了前面三个。但是还有一个.data的文件。这个通过名字就能看明白 data...。下面有用到。
下面有两种情况: 找到缓存 和 未找到缓存的情况
找到缓存之后: SonicConnect startLoading 开始。 通过 SonicURLProtocol 协议类 拦截 该动作,直接显示 缓存数据
主要通过 SonicURLProtocol 这个协议来加载缓存数据。
3、具体请求流程
3.1: 根据sessionID取出data
NSData *htmlData = [NSDatadataWithContentsOfFile:[selffilePathWithType:SonicCacheTypeHtmlsessionID:item.sessionID]];
并 从本地数据库中取出 data 的sha1加密值。与 sha1(htmlData)比较是否相等。如果相等 赋值SonicCacheItem。设置 htmlData、config 和 header。
3.2:设置 sonicServer 的 RequestHeader 和 RespondHeader。
3.3: 开始请求:请求流程 SonicSession start --- 设置Coockie ---- SonicConnect startLoading --- NSURLSession 请求。
3.4:回调: SonicConnect didReceiveResponse ---sonicServer didReceiveResponse --SonicSession didReceiveResponse
4、缓存条件
- (BOOL)isValidateSonicResponse:(NSHTTPURLResponse *)response
{
if ([response.allHeaderFields[SonicHeaderKeyCacheOffline]length] ==0) {
returnNO;
}
if ([response.allHeaderFields[SonicHeaderKeyETag]length] ==0) {
returnNO;
}
if ([response.allHeaderFields[SonicHeaderKeyTemplateChange]length] ==0) {
returnNO;
}
if ([response.allHeaderFields[SonicHeaderKeyTemplate]length] ==0) {
returnNO;
}
returnYES;
}
需要满足 SonicResponse 的结构 才能缓存