CandyWebCache是移动端web资源的本地缓存的解决方案,能够拦截webview的请求,并优先使用本地缓存静态资源进行响应,以此来对webview加载页面性能进行优化。
特点:
- 协议层拦截请求,透明替换响应
- 静态资源版本控制及更新策略
- 资源防篡改策略
- 静态资源自动打包到应用,及首次安装解压处理
(1) 修改Podfile。
pod 'CCCandyWebCache', :git => 'https://github.com/NEYouFan/ht-candywebcache-ios.git',:inhibit_warnings => true
pod 'ZipArchive', '~>1.3.0'
(2) 执行pod install
或 pod update
- 要求本地安装python
(1)从CCCandyWebCache源文件中找到CC_build_script.py
文件,并拷贝到与应用工程文件同级目录。
(2)修改CC_build_script.py
脚本文件相关配置信息
# connection info
WEBCACHE_SERVER = "127.0.0.1"
PORT = 8080
# appInfo
NATIVE_APP = "kaola"
NATIVE_VERSION = "1.0.0"
(3)添加打包脚本到工程
-
Xcode打包
- 在Xcode中选中工程文件 -> Build Phases
- 菜单栏Editor -> Add Build Phase -> Add Run Script Build Phase,在Build Phases可以看到新添加的Run Script,双击重命名为CandyWebCache Script
- 在Shell栏输入:
/usr/bin/python CC_build_script.py -b ${BUILT_PRODUCTS_DIR} -p ${FULL_PRODUCT_NAME}
,其中BUILT_PRODUCTS_DIR是build app所在路径,FULL_PRODUCT_NAME是app全名 - 如果日常debug想关闭每次build执行脚本,可以将
Run script only when installing
设置为勾选状态,等到真正进行product archive时,才会执行脚本
-
脚本打包
- 在打包脚本中添加
CC_build_script.py
的执行,注意传入正确的参数
- 在打包脚本中添加
脚本执行后,会向服务器请求线上最新资源,根据服务器返回结果,将线上最新的资源包下载并打包到app安装包中。
(1)导入头文件
#import "CCCandyWebCache.h"
(2)配置CandyWebCache
可以在AppDelegate.m的application:didFinishLaunchingWithOptions:方法中配置,也可以在其他合适的地方进行配置。
注意:设置配置信息接口[CCCandyWebCache setDefaultConfiguration:config]必须在首次调用[CCCandyWebCache defaultWebCache]之前进行调用,否则将忽略用户设置的配置信息而采用默认配置信息。
CCCandyWebCacheConfig* config = [CCCandyWebCacheConfig new];
config.serverAddress = @"127.0.0.1:8080";
config.appName = @"kaoLa";
config.appVersion = @"1.0.1";
config.blackListResourceTypes = @[@"html"];
[CCCandyWebCache setDefaultConfiguration:config];
(3)配置CCCacheManager[可选]
CCCandyWebCache* cacheManager = [CCCandyWebCache defaultWebCache].cacheManager;
cacheManager.concurrentDownloadCount = 3;
cacheManager.memCacheSize = 10 * 1024 * 1024;
(1)可以根据需求在合适的时间,如应用启动、前后台切换等,调用接口进行版本检测和更新。
[[CCCandyWebCache defaultWebCache] checkAndUpdateResource];
(2)也可以在配置信息CCCandyWebCacheConfig中设置pullInterval进行定时周期性资源检测和更新。
config.pullInterval = 10 * 60; //十分钟
(3)可以添加对象作为资源更新的监听器,监听器会收到资源更新的相关事件通知,但要在合适的时间,移除监听器,防止内存泄露。
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[[CCCandyWebCache defaultWebCache] addObserver:self];
...
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[[CCCandyWebCache defaultWebCache] removeObserver:self];
...
}
- 缓存功能开关,关闭将禁用CandyWebCache
[CCCandyWebCache defaultWebCache].enable = NO;
- 增量更新功能开关,关闭将只做全量更新
[CCCandyWebCache defaultWebCache].diffEnable = YES;
(1)启用CandyWebCache日志
[CCCandyWebCache setLogEnable:YES];
(2)设置日志级别
[CCCandyWebCache setLogLevel:CCLoggerLevelDebug];
为了方便测试,我们提供了demo服务器来配合集成CandyWebCache之后,进行测试。 demo服务器
提供给客户端SDK的接口:
- 版本检测接口,返回信息包括
- 请求的webapp对应的增量包和全量包信息:版本号、下载地址、md5、url、domains
- 请求中不包含的webapp则返回全量包信息:版本号、下载地址、md5、url、domains
提供给应用服务器的接口:
- 更新全量包
- 根据全量包和历史N(N可配置)个版本的包进行diff包计算
- 计算各个资源包的md5,并加密md5值
- 上传增量包和全量包到文件服务,并记录各个包的md5、资源url、版本号信息、domains
服务端功能要求:
- 计算资源包diff包(使用bsdiff)
- 上传资源到文件服务器
- 资源md5计算与加密(加密算法:DES + base64,客户端对称加密秘钥目前是埋在客户端代码中)
- webapp domains的配置
- 打包资源包目录路径要跟url能够对应,如
http://m.kaola.com/public/r/js/core_57384232.js
,资源的存放路径需要是public/r/js/core_57384232.js
或者r/js/core_57384232.js
。 - 资源缓存不支持带“?”的url,如果有版本号信息需要打到文件名中。对于为了解决缓存问题所采用的后缀形式url,如
http://m.kaola.com/public/r/js/core.js?v=57384232
,需要调整打包方式,采用文件名来区分版本号
该项目最低支持iOS 7.0
和Xcode 7.0
CandyWebCache使用MIT许可证,详情见LICENSE文件。