iOS應(yīng)用開發(fā)赵辕,使用WKWebView加載Web界面,對于頻繁訪問的Web頁面类咧,特別是移動端的Web應(yīng)用,用戶需要使用時快速加載出來蟹腾,這就需要依賴緩存機制支持痕惋,在WKWebView中,緩存機制分為兩種娃殖,內(nèi)存緩存和磁盤緩存
以下WKWebView簡稱wk
內(nèi)存緩存
內(nèi)存緩存是WkWebView自帶的緩存機制值戳,可以在較短時間快速讀取已緩存的資源文件,提高頁面打開速度炉爆,內(nèi)存方案主要使用
WKProcessPool
對象管理多個WKWebView實例的緩存池堕虹,其中每個WKWebView都有自己的緩存。當(dāng)WKWebView打開網(wǎng)頁芬首,WKProcessPool對象查詢自己管理的緩存是否有匹配的緩存赴捞,如果有,則立即讀取緩存資源并渲染頁面郁稍,提高性能和速度赦政。
開啟內(nèi)存緩存
內(nèi)存緩存是默認開啟的,可以通過一下WKWebViewConfiguration
獲取
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc]init];
WKProcessPool *processPool = config.processPool;
清理內(nèi)存緩存
內(nèi)存緩存會隨著WK轉(zhuǎn)移而釋放耀怜,但是如果占用過多恢着,可以手動清理
NSArray * types =@[WKWebsiteDataTypeMemoryCache,WKWebsiteDataTypeDiskCache]; // 9.0之后才有的
NSSet *websiteDataTypes = [NSSet setWithArray:types];
NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];
[[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{
}];
磁盤緩存
磁盤緩存是將Web資源文件緩存在設(shè)備本地磁盤,以便于下次訪問可以更快讀取财破,在WK中掰派,緩存文件位于Library/Cache
目錄,可以在設(shè)備本地進行讀取和存儲狈究。磁盤緩存方案一般采用URL緩存存儲機制碗淌,和H5緩存存儲機制盏求。
開啟磁盤緩存
開啟磁盤緩存需要使用,NSURLCache對象
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:2 * 1024 * 1024
diskCapacity:100 * 1024 * 1024
diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
清理磁盤緩存
[NSURLCache.sharedURLCache removeAllCachedResponses];
采用問答形式簡述WK緩存策略
什么情況下會緩存數(shù)據(jù)
客戶端第一次訪問網(wǎng)絡(luò)資源亿眠,如果響應(yīng)頭不包含(Expire碎罚、Cache-Control:max-age、Last-modifired等)纳像,那么不會緩存荆烈,下次直接發(fā)起請求。如果響應(yīng)頭包含了緩存控制字段竟趾,大多數(shù)情況下這些數(shù)據(jù)會被緩存憔购,下次啟訪問的時候執(zhí)行緩存邏輯判斷什么情況每次都需要校驗資源更新
響應(yīng)頭包含cache-control:max-ahe
或者pragma:no-cache
響應(yīng)頭只有etag
字段,沒有過期時間和修改時間緩存過期時間多久
響應(yīng)頭中cache-control:max-age=1800;表示緩存過期時間30分鐘
響應(yīng)頭Expire值表示過期時間(服務(wù)器時間)
響應(yīng)頭岔帽,如果沒上述兩個字段玫鸟,但有l(wèi)ast-modifired字段,則觸發(fā)啟發(fā)式緩存犀勒,緩存時間(date_value - last_modifired_value ) *0.1
資源校驗更新的過程是怎樣的
revalidated的指標(biāo)有兩個屎飘,last-modifired和etag,這兩個字段位于響應(yīng)頭中贾费,客戶端每次發(fā)起都會將這兩個指標(biāo)回調(diào)給服務(wù)器钦购,if-last-modifired對應(yīng)last-modifired的值,if-no-macth對應(yīng)etag的值褂萧,服務(wù)器進行對比押桃,客戶端最新資源返回304,服務(wù)器最新返回200和響應(yīng)數(shù)據(jù)
wk緩存流程總結(jié)
- 是否有緩存导犹,沒有則直接發(fā)起請求唱凯。有則進行下一步。
是否Ahe-Control:no-cache 或 Pragma:no-cache 字段 - 是否有緩存锡足,沒有則直接發(fā)起請求波丰。有則進行下一步。
是否每次都得進行資源更新校驗(響應(yīng)頭是否有 Cache-Control:no-cache 或 Pragma:no-cache 字段)舶得,不需要則進入3掰烟,需要則進入4 - 緩存是否過期(響應(yīng)頭,Cache-Control:max-age沐批、Expires纫骑、Last-Modified 啟發(fā)式緩存),沒過期則使用緩存九孩,不發(fā)起請求先馆。過期了則進入 4。
- 客戶端發(fā)起資源更新校驗請求(請求頭躺彬,If-Modified-Since : Last-Modified值煤墙、If-None-Match : ETag值)梅惯,如果資源沒有更新,服務(wù)器返回 304仿野,客戶端使用緩存铣减;如果資源有更新,服務(wù)器返回 200 和資源