概述
iOS7.0只有UIWebView, 而iOS8.0是有WKWebView, 但8.0的WKWebView沒有刪除緩存方法。iOS9.0之后就開始支持啦。
所以使用時(shí)候一定要適配iOS9.0以上
適用場景
當(dāng)我們的前端修改網(wǎng)頁上的某一些標(biāo)簽或增加內(nèi)容時(shí)候,需要最新的頁面,然而WK本身的緩存機(jī)制會把網(wǎng)頁內(nèi)容緩存到本地,導(dǎo)致前端更改的內(nèi)容不能及時(shí)在移動端更新UI,這個(gè)時(shí)候就需要清除WK的緩存,讓H5頁面一刷新就更新至最新的頁面。
清除所有的緩存
最好寫個(gè)分類,把清除緩存代碼放在分類里面,需要清除的時(shí)候直接調(diào)用。
import "WKWebView+ClearCache.h"
// 自定義清除緩存
- (void)customDeleteWebCache;
// 清除全部緩存
- (void)deleteWebCache;
// ios9以前清除緩存
- (void)clearCacheInCurrentVersion;
+ (void)deleteWebCache {
//allWebsiteDataTypes清除所有緩存
NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes];
NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];
[[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{
}];
}
自定義清除緩存
+ (void)customDeleteWebCache {
/*
在磁盤緩存上。
WKWebsiteDataTypeDiskCache,
html離線Web應(yīng)用程序緩存。
WKWebsiteDataTypeOfflineWebApplicationCache,
內(nèi)存緩存。
WKWebsiteDataTypeMemoryCache,
本地存儲。
WKWebsiteDataTypeLocalStorage,
Cookies
WKWebsiteDataTypeCookies,
會話存儲
WKWebsiteDataTypeSessionStorage,
IndexedDB數(shù)據(jù)庫。
WKWebsiteDataTypeIndexedDBDatabases,
查詢數(shù)據(jù)庫。
WKWebsiteDataTypeWebSQLDatabases
*/
NSArray * types=@[WKWebsiteDataTypeCookies,WKWebsiteDataTypeLocalStorage,WKWebsiteDataTypeDiskCache,WKWebsiteDataTypeMemoryCache,WKWebsiteDataTypeOfflineWebApplicationCache];
NSSet *websiteDataTypes= [NSSet setWithArray:types];
NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];
[[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{
}];
}
但開發(fā)app必須要兼容所有iOS版本,可是iOS8,iOS7沒有這種直接的方法,那該怎么辦呢?
(iOS7.0只有UIWebView, 而iOS8.0是有WKWebView, 但8.0的WKWebView沒有刪除緩存方法。)
針對與iOS7.0、iOS8.0、iOS9.0 WebView的緩存,我們找到了一個(gè)通吃的辦法:
NSString *libraryDir = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,
NSUserDomainMask, YES)[0];
NSString *bundleId = [[[NSBundle mainBundle] infoDictionary]
objectForKey:@"CFBundleIdentifier"];
NSString *webkitFolderInLib = [NSString stringWithFormat:@"%@/WebKit",libraryDir];
NSString *webKitFolderInCaches = [NSString
stringWithFormat:@"%@/Caches/%@/WebKit",libraryDir,bundleId];
NSString *webKitFolderInCachesfs = [NSString
stringWithFormat:@"%@/Caches/%@/fsCachedData",libraryDir,bundleId];
NSError *error;
/* iOS8.0 WebView Cache的存放路徑 */
[[NSFileManager defaultManager] removeItemAtPath:webKitFolderInCaches error:&error];
[[NSFileManager defaultManager] removeItemAtPath:webkitFolderInLib error:nil];
/* iOS7.0 WebView Cache的存放路徑 */
[[NSFileManager defaultManager] removeItemAtPath:webKitFolderInCachesfs error:&error];
希望能幫助因此困擾的小伙伴!