html缓存ios,iOS-H5离线包本地缓存CCCandyWebCache
一、離線包緩存的簡介離線包緩存含幾個包的概念:預裝包:指通過腳本文件在程序編譯時期下載的包。
增量包:指通過包的文件比對,生成的diff文件(差量包)
全量包:指完整的包文件CCCandyWebCache離線包緩存的邏輯第一次啟動的時候先請求預裝包接口安裝預裝包,同時將預裝包請求的response配置表放在本地中,獲取預裝包zip的文件名字,先去判斷能否在預裝包配置表里面,而后判斷預裝包文件的MD5值和預裝包配置表fullPackageMD5能否匹配。假如信息都匹配上則將預裝包移動到指定的本地目錄下(....../webapps/res/),而后解壓預裝包zip文件。
預裝包解壓成功后,會將本地包的信息組裝成body去請求檢查升級接口,將返回的數據結構轉模型,根據state判斷能否需要升級,假如要的話去判斷是全量升級還是增量升級。而后和本地數據庫的板塊名字比照能否有匹配,有的話判斷該包能否正在升級或者者有其余錯誤狀態,假如狀態是正確的則使用版本號做比照,看能否需要升級包,假如服務器返回數據的版本號更大則去升級資源。
假如是增量升級,將diff文件下載下來后,將其MD5值與請求升級的response的對應板塊的MD5值做匹配,匹配失敗則做全量升級,假如匹配成功則開始增量合并,假如本地老的資源zip包已經不存在則增量合并失敗,做全量升級。假如增量包合并失敗則進行全量升級。增量包合并成功則解壓zip包,替換掉原來的解壓后的文件。資源升級成功清理內存緩存。
全量升級,下載成功后,匹配zip包的MD5值,假如成功則移除原來的板塊文件,而后進行解壓。
每次啟動都會去請求檢查升級這個接口,判斷資源能否需要升級。
阻攔的URl的時候,先判斷URL 能否包含本地存儲的domain,包含則進行本地資源匹配,而后匹配上則去加載本地的html,css,js,等文件。否則正常去請求這個URL。
二、集成SDK遇到的坑1.由于使用swift項目,pod是動態庫,所以需要用本地庫去pod1.SDK的podspec 去掉了作者信息,導致pod不成功.所以要加上2.SDK的podspec ,homepage 指向不對,導致pod不成功.3. SDK的podspec 用了ZipArchive第三方庫但沒有指明依賴關系,導致pod不成功.2.預裝包解析字段不正確CCCacheManger 360行 開始 // 字段不正確appVersionInfos -> resInfosappId -> resIDVersion -> resVersioninfo.domains = [dic objectForKey:@"domains"]; // 取值不正確// 更換如下:if (dic[@"userData"]) { info.domains = [dic[@"userData"] objectForKey:@"domains"]; }3.字段fullMD5服務器要進行Des加密+Base64,由于SDK對fullMD5進行了Base64 decodo 和 Des解密
4.預裝包和檢查升級是post請求
5.檢查升級返回的response 解析數據不正常導致 crashHTResourceVersionChecker 214行 SDK模型里面的userData 是字符串 這里是Data類型6.因為CCCancahce 是正對UIWebView做的緩存,而我們項目是WKWebView ,所以阻攔不到網頁的請求,需要做少量解決 增加NSURLProtocol+WebKitSupport 這個類,才可以阻攔WKWebView的網絡請求// .h文件#import @interface NSURLProtocol (WebKitSupport)+ (void)wk_registerScheme:(NSString*)scheme;+ (void)wk_unregisterScheme:(NSString*)scheme;@end // .m文件#import "NSURLProtocol+WebKitSupport.h"#import /** * The functions below use some undocumented APIs, which may lead to rejection by Apple. */FOUNDATION_STATIC_INLINE Class ContextControllerClass() { static Class cls; if (!cls) { cls = [[[WKWebView new] valueForKey:@"browsingContextController"] class]; } return cls;}FOUNDATION_STATIC_INLINE SEL RegisterSchemeSelector() { return NSSelectorFromString(@"registerSchemeForCustomProtocol:");}FOUNDATION_STATIC_INLINE SEL UnregisterSchemeSelector() { return NSSelectorFromString(@"unregisterSchemeForCustomProtocol:");}@implementation NSURLProtocol (WebKitSupport)+ (void)wk_registerScheme:(NSString *)scheme { Class cls = ContextControllerClass(); SEL sel = RegisterSchemeSelector(); if ([(id)cls respondsToSelector:sel]) {#pragma clang diagnostic push#pragma clang diagnostic ignored "-Warc-performSelector-leaks" [(id)cls performSelector:sel withObject:scheme];#pragma clang diagnostic pop }}+ (void)wk_unregisterScheme:(NSString *)scheme { Class cls = ContextControllerClass(); SEL sel = UnregisterSchemeSelector(); if ([(id)cls respondsToSelector:sel]) {#pragma clang diagnostic push#pragma clang diagnostic ignored "-Warc-performSelector-leaks" [(id)cls performSelector:sel withObject:scheme];#pragma clang diagnostic pop }}@end7.增量升級MD5校驗失敗,進行全量升級,資源是升級但是沒有升級本地的version// 要在CCCandyWebCache 333行進行新的版本賦值NSArray* comps = [info.composeVersion componentsSeparatedByString:@"&"];info.version = (comps.count == 2 ? comps[1] : comps[0]);8.多個包domain應該對應于ResID 的目錄名 而不是域名,要不然多個離線包會有問題。// 如 https://www.baicu.com/feature/task// feature/task 是zip包解壓后的文件目錄9.攔擊到的URL匹配規則有問題,要截取到domain的域名去拼接路徑,而后去匹配本地能否有緩存。// CCCacheManager 187行[_domainWebappInfos enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull domain, CCWebAppInfo * _Nonnull webappInfo, BOOL * _Nonnull stop) { NSString *domainLastObject = [domain componentsSeparatedByString:@"://"].lastObject; if ([url hasPrefix:domainLastObject]) { if (webappInfo.status != CCWebAppStatusAvailable) { CCLogWarn(@"[CCCacheManager]:資源正在升級或者已出錯,請求不使用緩存,url==>:%@。",url); } if (url.length > domainLastObject.length) { NSString *domainOrigin = [domainLastObject componentsSeparatedByString:@"/"].firstObject; key = [NSString stringWithFormat:@"%@/%@",webappInfo.name,[url substringFromIndex:domainOrigin.length+1]]; } [_urlToKeyMapCache setObject:key forKey:url]; *stop = YES; } }];// CCCacheManager 174 對 webView reload方法 低版本系統做兼容NSArray* strs = [url componentsSeparatedByString:@"://"]; if (strs.count == 2) { NSArray *strsurl = [strs[1] componentsSeparatedByString:@".html"]; if (strsurl.count == 2 && [strsurl[1] isEqualToString:@"#/"]) { url = [strsurl[0] stringByAppendingString:@".html"]; } else { url = strs[1]; } }10.移除緩存下載進度觀察者 不能放在deinit方法里面 要不然會影響內存泄漏,增加和移除要放在viewWillAppear 和 viewWillDisappear方法里面11.緩存url不支持帶?號訪問12.增量或者全量升級判斷條件不正確// CCCandyWebCache.m 206行 webappInfo.isDiffTask = _diffEnable ? (versionInfo.diffUrl.length ? YES : NO) : NO; // 更換如下: webappInfo.isDiffTask = _diffEnable ? (versionInfo.diffUrl.length > 0 ? YES : NO) : NO;
總結
以上是生活随笔為你收集整理的html缓存ios,iOS-H5离线包本地缓存CCCandyWebCache的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opencv for python (6
- 下一篇: 坐标反算c语言程序,测量坐标计算程序