緩存策略有以下四種方式:
- 默認的NSURLRequest 緩存策略
后臺需要做響應頭設置,否則無法進行緩存。存在cache目錄,n磁盤緊張會被清除
- NSURLCache
和上面類似。可以不需要后臺設置也能存儲。存在cache目錄,n磁盤緊張會被清除
- 下載網頁
將整個網頁下載下來,正則匹配圖片url,下載圖片至本地。替換圖片URL,創立數據庫管理,管理繁瑣,細致到每一張圖片的增刪改。存儲目錄隨意
- 服務器壓縮包
將從服務器下載壓縮包,圖片資源,css,js等都是相對路徑。下載成功后切換,做好對比,就可以做好 存儲目錄隨意
在說存儲之前,首先要了解兩個類
通過這前兩個類來實現離線化
1. 設置NSURLCache
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//URL緩存設置
NSURLCache *urlCache = [[NSURLCache alloc]initWithMemoryCapacity:25*1024*1024 diskCapacity:100*1024*1024 diskPath:nil];
[NSURLCache setSharedURLCache:urlCache];
return YES;
}
2. 存儲離線緩存
在WKWebView中,加載成功后,將此次的請求請求緩存起來
//轉換為NSURL類型
NSURL *url = [NSURL URLWithString:self.loadURL];
//WK用于正常加載
self.request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:6];
//得到NSData 數據
NSData *dataContent = [NSData dataWithContentsOfURL:url];
//NSURLCache 實例化
NSURLCache *cache = [NSURLCache sharedURLCache];
//得到相應
NSURLResponse *response = [[NSURLResponse alloc]initWithURL:url MIMEType:@"text/html" expectedContentLength:0 textEncodingName:@"UTF-8"];
//得到CacheURLResponse
NSCachedURLResponse *cacheResponse = [[NSCachedURLResponse alloc]initWithResponse:response data:dataContent];
//進行存儲
[cache storeCachedResponse:cacheResponse forRequest:self.request];
在APP目錄中,會在Caches目錄下以Bundle Identifier為名創建緩存目錄。緩存的資源圖片,CSS、JS、html等都在這個目錄下。
正常加載
[self.wkWebView loadRequest:self.request];
離線加載
NSURLCache *cache = [NSURLCache sharedURLCache];
NSCachedURLResponse *current = [cache cachedResponseForRequest:self.request];
[self.wkWebView loadData:current.data MIMEType:@"text/html" characterEncodingName:@"UTF-8" baseURL:self.request.URL];
沒錯,這是核心代碼,就這么點。說真的,用到的就這么多,但實際上業務不同,產生的邏輯思路也不同。你會發現存儲的目錄在Cache下面,如果手機的內存警告,磁盤空間不足,將會被清理掉。對不需要長久持續保持的業務來說,沒有什么必要,但需要長久保存的業務來說是致命的。