-
2021-10-26 18:49:24
//清除缓存 [[NSURLCache sharedURLCache] removeAllCachedResponses]; [[NSURLCache sharedURLCache] setDiskCapacity:0]; [[NSURLCache sharedURLCache] setMemoryCapacity:0]; //清除Cookie NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; for (NSHTTPCookie *cookie in [storage cookies]) { [storage deleteCookie:cookie]; }
iOS9之后新增了按时间清除web缓存的方法
NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes]; NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0]; [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{ NSLog(@"WKWebsiteDataStore removeDataOfTypes"); }];
/*! @abstract Removes website data of the given types for the given data records. @param dataTypes The website data types that should be removed. @param dataRecords The website data records to delete website data for. @param completionHandler A block to invoke when the website data for the records has been removed. */ - (void)removeDataOfTypes:(NSSet<NSString *> *)dataTypes forDataRecords:(NSArray<WKWebsiteDataRecord *> *)dataRecords completionHandler:(void (^)(void))completionHandler; /*! @abstract Removes all website data of the given types that has been modified since the given date. @param dataTypes The website data types that should be removed. @param date A date. All website data modified after this date will be removed. @param completionHandler A block to invoke when the website data has been removed. */ - (void)removeDataOfTypes:(NSSet<NSString *> *)dataTypes modifiedSince:(NSDate *)date completionHandler:(void (^)(void))completionHandler;
更多相关内容 -
WKWebview缓存图片
2018-04-18 11:13:09WKWebview缓存图片加载以及重定向,如何获取WKWebview的图片 -
wkWebView缓存问题
2022-04-08 10:24:01发生背景 项目是一个IOS套壳的H5项目 现在的问题 比如H5代码从1.0版本升级到2.0版本,app打开后也会正常访问2.0版本的H5代码,但是app后台挂一段时间后在访问,莫名的又会变回1.0版本的代码, 我想要达到的结果 这个... -
iOS WKWebView离线缓存
2021-07-09 12:45:34功能包括: WKWebView的使用、JS和OC的交互、网页内容加载进度条的实现、WKWebView+UITableView混排 、 WKWebView离线缓存等。GitHub:https://github.com/wsl2ls/iOS_TipsiOS_Tips集合简介:1、暗黑模式2、AppleID... -
WKWebView缓存问题处理
2021-02-01 11:29:06如何不用缓存,每次请求最新的Web数据 - (void)loadNoCacheData { NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.baidu.com"]]; NSMutableURLRequest *request = ...如何不用缓存,每次请求最新的Web数据
- (void)loadNoCacheData { NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.baidu.com"]]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:15.0]; [_webView loadRequest:request]; }
每次请求设置缓存策略为不使用缓存:NSURLRequestReloadIgnoringLocalCacheData
typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy) { NSURLRequestUseProtocolCachePolicy = 0, NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3, NSURLRequestReloadRevalidatingCacheData = 5, };
如果请求的时候使用了默认的缓存策略,可以通过以下方式清除缓存:
- (void)deleteWebCache { //allWebsiteDataTypes清除所有缓存 NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes]; NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0]; [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{ }]; }
也可以自定义清除缓存
- (void)deleteWebCache { NSArray *types = @[WKWebsiteDataTypeCookies, WKWebsiteDataTypeLocalStorage]; NSSet *websiteDataTypes= [NSSet setWithArray:types]; NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0]; [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{ }]; }
/*! @constant WKWebsiteDataTypeDiskCache On-disk caches. */ WK_EXTERN NSString * const WKWebsiteDataTypeDiskCache API_AVAILABLE(macos(10.11), ios(9.0)); /*! @constant WKWebsiteDataTypeMemoryCache In-memory caches. */ WK_EXTERN NSString * const WKWebsiteDataTypeMemoryCache API_AVAILABLE(macos(10.11), ios(9.0)); /*! @constant WKWebsiteDataTypeOfflineWebApplicationCache HTML offline web application caches. */ WK_EXTERN NSString * const WKWebsiteDataTypeOfflineWebApplicationCache API_AVAILABLE(macos(10.11), ios(9.0)); /*! @constant WKWebsiteDataTypeCookies Cookies. */ WK_EXTERN NSString * const WKWebsiteDataTypeCookies API_AVAILABLE(macos(10.11), ios(9.0)); /*! @constant WKWebsiteDataTypeSessionStorage HTML session storage. */ WK_EXTERN NSString * const WKWebsiteDataTypeSessionStorage API_AVAILABLE(macos(10.11), ios(9.0)); /*! @constant WKWebsiteDataTypeLocalStorage HTML local storage. */ WK_EXTERN NSString * const WKWebsiteDataTypeLocalStorage API_AVAILABLE(macos(10.11), ios(9.0)); /*! @constant WKWebsiteDataTypeWebSQLDatabases WebSQL databases. */ WK_EXTERN NSString * const WKWebsiteDataTypeWebSQLDatabases API_AVAILABLE(macos(10.11), ios(9.0)); /*! @constant WKWebsiteDataTypeIndexedDBDatabases IndexedDB databases. */ WK_EXTERN NSString * const WKWebsiteDataTypeIndexedDBDatabases API_AVAILABLE(macos(10.11), ios(9.0));
-
iOS-WKWebView缓存并保证实时性
2020-01-16 17:47:20说到WKWebView的缓存,我之前也写过一篇关于UIWebView的缓存的,文章地址如下: 《iOS-UIWebview缓存并保证实时性》 但是这个方法对于WKWebView就失去了效果,后来公司的项目全部改为WKWebView,至于WKWebView的...前言
说到WKWebView的缓存,我之前也写过一篇关于UIWebView的缓存的,文章地址如下:
但是这个方法对于WKWebView就失去了效果,后来公司的项目全部改为WKWebView,至于WKWebView的好处,这边就不过多叙述了;上面的方法要是在WKWebView上就失效了,后来我也修改了新的方案,自己的闲暇时间一直在维护自己的几款软件ZFJObsLib、ZFJPyMix,所以一直没时间总结优化一下,在此我对ZFJCacheProtocol重新优化了一下,大家也可以根据自己的理解和需求自行优化设计;在UIWebView的时候我是缓存全部数据的,在这里开发者可以自行选择缓存的类型!
具体流程图如下:
如果想详细了解NSURLRequest的相关的缓存机制,可以看《iOS-UIWebview缓存并保证实时性》
详细API如下:
ZFJWebCache
使用效果
使用教程
只需要在需要监听的页面开启网络监听就可以了,在不需要监听的时候取消监听即可,如下:
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; //开始监听缓存数据 [ZFJCacheProtocol startMonitorRequest:ZFJCacheAllType]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; //在不需要用到webview的时候即使的取消监听 [ZFJCacheProtocol cancelMonitorRequest]; }
自定义配置
1.自定义缓存类型
ZFJWebCache主要根据MIMEType可以对缓存的数据类型进行区分,具体指出的缓存类型如下:
typedef NS_ENUM(NSInteger, ZFJCacheType) { ZFJCacheAllType = 1 << 0, //缓存全部 ZFJCacheImageType = 1 << 1, //缓存图片 ZFJCacheVideoType = 1 << 2, //缓存视频 ZFJCacheAudioType = 1 << 3, //缓存音频 ZFJCacheTextType = 1 << 4, //缓存text ZFJCacheMessageType = 1 << 5, //缓存message ZFJCacheX_WorldType = 1 << 6, //缓存x-world ZFJCacheApplicationType = 1 << 7, //缓存application ZFJCacheNoneType = 1 << 8, //未知类型 };
比如你只想缓存image使用如下:
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; //开始监听缓存数据 [ZFJCacheProtocol startMonitorRequest:ZFJCacheImageType]; }
2.设置缓存过期时间
ZFJWebCache的默认过期时间是一小时(3600s),如果想自定义缓存过期时间可设置如下:
// 设置缓存过期时间 [ZFJCacheConfig instance].updateInterval = 1200;
3.设置忽略url
NSArray *ignoreUrlArray = @[@"http://www.baidu.com"]; [ZFJCacheConfig instance].ignoreUrlArray = ignoreUrlArray;
4.其他配置API如下
// // ZFJCacheConfig.h // Ahaschool // // Created by ZFJMBPro on 2020/1/13. // Copyright © 2020 ahaschool. All rights reserved. // #import <Foundation/Foundation.h> #import "ZFJMIMEType.h" @interface ZFJCacheConfig : NSObject + (instancetype)instance; /// 上一次url请求时间 @property (readwrite, nonatomic, strong) NSDictionary *lastRequestDict; /// 支持的缓存类型 @property (nonatomic,assign) ZFJCacheType cacheType; /// 相同的Url请求缓存时间间隔(默认3600s) @property (readwrite, nonatomic, assign) NSInteger updateInterval; /// 为NSURLSession配置一些请求所需要的策略 @property (readwrite, nonatomic, strong) NSURLSessionConfiguration *config; /// 请求任务队列 @property (readwrite, nonatomic, strong) NSOperationQueue *forgeroundNetQueue; /// 缓存任务队列 @property (readwrite, nonatomic, strong) NSOperationQueue *backgroundNetQueue; /// 忽略的url链接 @property (nonatomic, strong) NSArray *ignoreUrlArray; /// 清空内存中的url记录(收到内存警告的时候可以调用这个方法清空内存中的url记录) - (void)clearUrlDict; /// 获取缓存路径 - (NSString *)documentPath; /// 是否支持缓存 - (BOOL)isSupportCache:(NSString *)mimeType; @end
源码
GTIEE:https://gitee.com/zfj1128/ZFJWebCache
结束语
欢迎各位大佬提供宝贵的建议和意见,也欢迎大家进群或加本人QQ一起交流学习!
-
iOS 开发 WKWebView缓存处理的问题
2018-11-22 12:41:52WKWebView使用中遇到的问题 1.关于缓存的问题 因为使用了WKWebView,后端的策划人员换图,iOS端没有更新,然后google了好久,最终算是解决了这个问题。 首先,加载第一个页面。 _urlStr = @"...WKWebView使用中遇到的问题
1.关于缓存的问题
因为使用了WKWebView,后端的策划人员换图,iOS端没有更新,然后google了好久,最终算是解决了这个问题。
首先,加载第一个页面。
_urlStr = @"https://www.baidu.com";
//设置缓存的请求策略和超时时间
NSURLRequest * urlReuqest = [[NSURLRequest alloc]initWithURL:[NSURL URLWithString:_urlStr] cachePolicy:1 timeoutInterval:30.0f];
[_webView loadRequest:urlReuqest];
这时能正常的显示第一个页面,及时更换了图片也能正常的显示。
但是在跳转另一个URL时,不能设置缓存方式。。。这样就造成了,如果你更换了图片,并且之前你进入了这个页面,就导致了你看到的是以前的页面。我这里找到的处理的方式是在这个WKWebView调用dealloc方法时,把html页面的缓存全部删掉。以下是方法
//在ViewController销毁时移除KVO观察者,同时清除所有的html缓存
- (void)dealloc {
[self.webView removeObserver:self forKeyPath:@"estimatedProgress"];
[self.webView removeObserver:self forKeyPath:@"title"];
[self clearCache];
}
/** 清理缓存的方法,这个方法会清除缓存类型为HTML类型的文件*/
- (void)clearCache {
/* 取得Library文件夹的位置*/
NSString *libraryDir = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask, YES)[0];
/* 取得bundle id,用作文件拼接用*/
NSString *bundleId = [[[NSBundle mainBundle] infoDictionary]objectForKey:@"CFBundleIdentifier"];
/*
* 拼接缓存地址,具体目录为App/Library/Caches/你的APPBundleID/fsCachedData
*/
NSString *webKitFolderInCachesfs = [NSString stringWithFormat:@"%@/Caches/%@/fsCachedData",libraryDir,bundleId];
NSError *error;
/* 取得目录下所有的文件,取得文件数组*/
NSFileManager *fileManager = [NSFileManager defaultManager];
// NSArray *fileList = [[NSArray alloc] init];
//fileList便是包含有该文件夹下所有文件的文件名及文件夹名的数组
NSArray *fileList = [fileManager contentsOfDirectoryAtPath:webKitFolderInCachesfs error:&error];
/* 遍历文件组成的数组*/
for(NSString * fileName in fileList){
/* 定位每个文件的位置*/
NSString * path = [[NSBundle bundleWithPath:webKitFolderInCachesfs] pathForResource:fileName ofType:@""];
/* 将文件转换为NSData类型的数据*/
NSData * fileData = [NSData dataWithContentsOfFile:path];
/* 如果FileData的长度大于2,说明FileData不为空*/
if(fileData.length >2){
/* 创建两个用于显示文件类型的变量*/
int char1 =0;
int char2 =0;
[fileData getBytes:&char1 range:NSMakeRange(0,1)];
[fileData getBytes:&char2 range:NSMakeRange(1,1)];
/* 拼接两个变量*/
NSString *numStr = [NSString stringWithFormat:@"%i%i",char1,char2];
/* 如果该文件前四个字符是6033,说明是Html文件,删除掉本地的缓存*/
if([numStr isEqualToString:@"6033"]){
[[NSFileManager defaultManager] removeItemAtPath:[NSString stringWithFormat:@"%@/%@",webKitFolderInCachesfs,fileName]error:&error];
continue;
}
}
}
}
-
iOS常用方法——WKWebView缓存清理的实现
2018-07-03 14:09:41WKWebView是iOS8之后出现的,相较于UIWebView,WKWebView占用的内存更小,还有一些其他的优化。但是如果我们不去主动清理webView产生的缓存,两者都会存在缓存这个问题。比如说一个网页改了一些内容,如果不清理缓存... -
WKWebView离线缓存
2022-07-15 04:02:27WKWebView离线缓存 -
WKWebView缓存问题(续)
2021-06-18 11:15:52# 缓存问题续在上一篇文章中,提到精确控制缓存,是从别人的文章上看来的,经过老大一发问,顿时语塞,精确控制用的是NSURLSession的方法,那就意味着不用webView的load系列方法而是用NSURLSession的dataTask将对应的资源... -
WKWebView的缓存问题
2021-06-13 08:50:52缓存策略WKWebView提供的实现了的缓存策略NSURLRequestUseProtocolCachePolicy//默认的缓存策略NSURLRequestReloadIgnoringCacheData//重新请求忽略缓存NSURLRequestReturnCacheDataElseLoad//有缓存就返回缓存,没有... -
WKWebView 的缓存策略
2021-08-01 04:41:44缓存策略有以下四种方式:默认的NSURLRequest 缓存策略后台需要做响应头设置,否则无法进行缓存。存在cache目录,n磁盘紧张会被清除NSURLCache和上面类似。可以不需要后台设置也能存储。存在cache目录,n磁盘紧张会... -
WKWebView清除缓存
2021-05-01 16:02:30需要引入框架import WebKit let recordType = WKWebsiteDataStore.allWebsiteDataTypes() WKWebsiteDataStore.default().fetchDataRecords(ofTypes: recordType) { records in WKWebsiteDataStore.default().remove... -
WKWebView的缓存
2019-03-20 10:52:26相信使用过webView的人都挺烦每次都有一段空白期,用户体验感极差,所以公司要求在webView上增加缓存,废话不多说了,进入正题! 1.使用WKWebView // 1.简单创建WKWebView WKWebView *webView = [[WKWebView ... -
iOS WKWebView 的缓存策略
2020-12-03 10:33:57缓存策略有以下四种方式: 默认的NSURLRequest 缓存策略 后台需要做响应头设置,否则无法进行缓存。存在cache目录,n磁盘紧张会被清除 NSURLCache 和上面类似。可以不需要后台设置也能存储。存在cache目录,n磁盘... -
swift 去掉WKWebView缓存的方法
2019-08-30 10:19:55直接上代码 func clearCache() { if #available(iOS 9.0, *) { let websiteDataTypes = NSSet(array: [WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache]) let date = NSDat... -
【Swift】WKWebView默认缓存策略与HTTP缓存协议
2020-11-12 16:44:24转载地址: WKWebView默认缓存策略与HTTP缓存协议 -
WKWebView 清除缓存的方法
2020-05-24 17:26:55iOS7.0只有UIWebView, 而iOS8.0是有WKWebView, 但8.0的WKWebView没有删除缓存方法。iOS9.0之后就开始支持啦。 所以使用时候一定要适配iOS9.0以上 适用场景 当我们的前端修改网页上的某一些标签或增加内容时候,... -
清除WKWebView的缓存
2021-06-13 08:52:31清除WKWebView的缓存OC写法: swift写法再下下面。清除WKWebView的缓存,让H5页面一刷新就更新至最新的页面直接上代码~!~~要区分iOS9.0和8.0两种- (void)deleteWebCache {if ([[UIDevice currentDevice].system... -
WKWebView默认缓存的使用
2020-09-10 11:01:09WKWebView加载网页时为了追求更好的用户体验,会设计一个缓存机制来应对加载缓慢的问题。 缓存的方案一般有2种: 1.利用浏览器自带的缓存机制。优点(缓存机制由系统提供方便快捷),缺点(系统将内容存在cache中,... -
深入理解 WKWebView(基础篇)-- 探究 WebKit 缓存
2022-01-19 00:03:40????????关注后回复“进群”,拉你进程序员交流群??...作者丨童红明来源丨百度App技术1. 前言缓存可以减少冗余的数据传输,解决网络瓶颈问题,降低服务端压力,提升页面加载速度。高效利用缓存可大... -
WKWebView网页缓存刷新问题
2021-06-18 11:14:49由于不懂后端的知识,折腾了很久,网上也查找了很多都说需要清除缓存。这是在网上查找的iOS9以上清除缓存方法NSArray * types = @[WKWebsiteDataTypeMemoryCache,WKWebsiteDataTypeDiskCache];NSSet*... -
iOS开发WKWebView如何清除缓存2018-08-16
2020-08-14 15:12:50iOS7.0只有UIWebView, 而iOS8.0是有WKWebView, 但8.0的WKWebView没有删除缓存方法。iOS9.0之后就开始支持啦。 所以使用时候一定要适配iOS9.0以上 适用场景 当我们的前端修改网页上的某一些标签或增加内容时候,... -
WKWebView对网页和js,css,png等资源文件的缓存机制及如何刷新缓存
2018-08-27 14:28:56WKWebView对网页和js,css,png等资源文件都进行缓存。...最佳解决方案是js中对每一个网址,js,css,png等资源文件下载地址都加版本号,这样既利用了WKWebView缓存机制又实现了他们按照需要刷新。... -
iOS 使用WKWebView缓存cookie
2019-09-16 10:30:56废话不多说,直接上代码 //插入设置cookie -(void)insertCookie{ // 创建一个可变字典存放cookie NSHTTPCookie *cookie =[self setcookie];... if (@available(iOS 11.0, *)) { ... WKHTTPCookieStore *... -
WKWebView 网页缓存和刷新
2020-04-08 15:59:11WKWebView的缓存策略 typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy) { NSURLRequestUseProtocolCachePolicy = 0, // 默认策略,具体的缓存逻辑和协议的声明有关,如果协议没有声明,不需要每次重... -
WKWebView关于缓存的问题
2018-05-13 18:55:40WKWebView使用中遇到的问题 1.关于缓存的问题 因为使用了WKWebView,后端的策划人员换图,iOS端没有更新,然后google了好久,最终算是解决了这个问题。 首先,加载第一个页面。 _urlStr = @"... -
清除WKWebView缓存
2019-09-27 13:23:46清空缓存完成 " ) } } else { let libraryPath = NSSearchPathForDirectoriesInDomains(.LibraryDirectory, .UserDomainMask, true )[ 0 ] let cookiesFolderPath = libraryPath.stringByAppendingString( ... -
删除WKWebView的缓存
2016-12-19 19:04:57iOS开发, 混编成为一种趋势。在中国,用户量较大的几个代表性app,淘宝,微信,支付宝,京东...H5与native的交互变得越来越频繁,从而出现的问题也越来越多,下面我们一起讨论关于WKWebView的缓存问题。 场景: 当