WKWebView加載網(wǎng)頁時為了追求更好的用戶體驗狐血,會設計一個緩存機制來應對加載緩慢的問題啥酱。
緩存的方案一般有2種:
1.利用瀏覽器自帶的緩存機制区转。優(yōu)點(緩存機制由系統(tǒng)提供方便快捷)弧满,缺點(系統(tǒng)將內容存在cache中咬扇,在遇到內存緊張的時候會自動清理一次)
2.將網(wǎng)頁內容以壓縮包的形式下載到Document下面,解壓后進行加載鸡挠。優(yōu)點(Document下的資源不會被無故清除)辉饱,缺點(需要自行設計一整套更新替換方案,iOS9以下的需要把內容copy到temp目錄才能讀燃鹫埂)
這里就第1種利用系統(tǒng)的緩存方案進行了嘗試彭沼。
系統(tǒng)的請求方法
let url = URL.init(string: "http://localhost/htmlMoudle/index")!
let request = URLRequest.init(url: url, cachePolicy: .reloadRevalidatingCacheData, timeoutInterval: 15.0)
self.webView?.load(request)
這其中的cachePolicay是一個枚舉,具體的含義如下
case useProtocolCachePolicy//默認方式
case reloadIgnoringLocalCacheData//不使用緩存
case reloadIgnoringLocalAndRemoteCacheData//決不使用任何緩存
case returnCacheDataElseLoad//使用緩存(不管它是否過期)备埃,如果緩存中沒有姓惑,那從網(wǎng)絡加載吧
case returnCacheDataDontLoad//離線模式:使用緩存(不管它是否過期)译株,但是不從網(wǎng)絡加載
case reloadRevalidatingCacheData//驗證本地數(shù)據(jù)與遠程數(shù)據(jù)是否相同,如果不同則下載遠程數(shù)據(jù)挺益,否則使用本地數(shù)據(jù)
根據(jù)枚舉的描述歉糜,普遍的需求貌似只需要最后那種方式reloadRevalidatingCacheData來進行請求就能達到正常的更新和緩存使用的要求了。
reloadRevalidatingCacheData緩存策略的驗證
一望众、準備工作
1.(Mac電腦)將準備好的工程放到:/資源庫/WebServer/Documents下匪补,如圖所示
屏幕快照 2018-09-29 11.26.32.png
2.打開終端,開啟mac電腦的apache服務器:
開啟apache: sudo apachectl start
重啟apache: sudo apachectl restart
關閉apache: sudo apachectl stop
二烂翰、修改前的運行結果
修改前的截圖.png
三夯缺、修改后的運行結果
修改后的截圖.png
測試說明reloadRevalidatingCacheData確實是有效的,有個問題就是如果在這個網(wǎng)頁之內請求的其它的網(wǎng)頁甘耿,這個新點開的網(wǎng)頁的緩存策略就會換成了默認的緩存策略了踊兜。
清除緩存
系統(tǒng)會在cache內存警告的時候自行清理緩存一次,手動清除緩存代碼如下(根據(jù)具體情況使用)
/**支持iOS9.0以上的清理方法*/
/**dataTypes傳一個集合佳恬,可以指定只刪除內存或是Disk或是cookie的內容等*/
let dataTypes = WKWebsiteDataStore.allWebsiteDataTypes()
let date = Date.init(timeIntervalSince1970: 0)
WKWebsiteDataStore.default().removeData(ofTypes: dataTypes, modifiedSince: date) {}
/**支持iOS8.0以上的清理方法*/
let cachePath = NSHomeDirectory() + "/Library/Caches"
let bundleId : String = Bundle.main.infoDictionary!["CFBundleIdentifier"] as! String
let webKitCachePath = cachePath+"/"+bundleId+"/WebKit"
try!FileManager.default.removeItem(atPath: webKitCachePath)