日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

html缓存ios,iOS-H5离线包本地缓存CCCandyWebCache

發(fā)布時間:2023/12/8 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 html缓存ios,iOS-H5离线包本地缓存CCCandyWebCache 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、離線包緩存的簡介離線包緩存含幾個包的概念:預裝包:指通過腳本文件在程序編譯時期下載的包。

增量包:指通過包的文件比對,生成的diff文件(差量包)

全量包:指完整的包文件CCCandyWebCache離線包緩存的邏輯第一次啟動的時候先請求預裝包接口安裝預裝包,同時將預裝包請求的response配置表放在本地中,獲取預裝包zip的文件名字,先去判斷能否在預裝包配置表里面,而后判斷預裝包文件的MD5值和預裝包配置表fullPackageMD5能否匹配。假如信息都匹配上則將預裝包移動到指定的本地目錄下(....../webapps/res/),而后解壓預裝包zip文件。

預裝包解壓成功后,會將本地包的信息組裝成body去請求檢查升級接口,將返回的數(shù)據(jù)結構轉模型,根據(jù)state判斷能否需要升級,假如要的話去判斷是全量升級還是增量升級。而后和本地數(shù)據(jù)庫的板塊名字比照能否有匹配,有的話判斷該包能否正在升級或者者有其余錯誤狀態(tài),假如狀態(tài)是正確的則使用版本號做比照,看能否需要升級包,假如服務器返回數(shù)據(jù)的版本號更大則去升級資源。

假如是增量升級,將diff文件下載下來后,將其MD5值與請求升級的response的對應板塊的MD5值做匹配,匹配失敗則做全量升級,假如匹配成功則開始增量合并,假如本地老的資源zip包已經(jīng)不存在則增量合并失敗,做全量升級。假如增量包合并失敗則進行全量升級。增量包合并成功則解壓zip包,替換掉原來的解壓后的文件。資源升級成功清理內存緩存。

全量升級,下載成功后,匹配zip包的MD5值,假如成功則移除原來的板塊文件,而后進行解壓。

每次啟動都會去請求檢查升級這個接口,判斷資源能否需要升級。

阻攔的URl的時候,先判斷URL 能否包含本地存儲的domain,包含則進行本地資源匹配,而后匹配上則去加載本地的html,css,js,等文件。否則正常去請求這個URL。

二、集成SDK遇到的坑1.由于使用swift項目,pod是動態(tài)庫,所以需要用本地庫去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 解析數(shù)據(jù)不正常導致 crashHTResourceVersionChecker 214行 SDK模型里面的userData 是字符串 這里是Data類型6.因為CCCancahce 是正對UIWebView做的緩存,而我們項目是WKWebView ,所以阻攔不到網(wǎng)頁的請求,需要做少量解決 增加NSURLProtocol+WebKitSupport 這個類,才可以阻攔WKWebView的網(wǎng)絡請求// .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匹配規(guī)則有問題,要截取到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方法 低版本系統(tǒng)做兼容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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。