再次更新,根据下面的问题,可以通过H5来标记是否pop到根部而且移除所有的js

- (void)mtf_ios_backButtonPressed:(nullable id)sender{if (self.viewModel.isDestroyHistory){[self removeScriptMessageAll];[self.navigationController popToAnchorViewControllerAnimated:YES];}else{if (self.webView.canGoBack) {[self.webView goBack];}else{[self removeScriptMessageAll];[super mtf_ios_backButtonPressed:sender];}}
}
#pragma mark - Js 调用 OC
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{NSString *methodName = message.name;if ([methodName isEqualToString:@"name1"]) {else if ([methodName isEqualToString:@"捕获到的字段2"]){// 由前端进行标记self.viewModel.isDestroyHistory = YES;}
}

前端调用标记,里面的mintouapp就是我们捕获到的字段

if(window.MTAPP||window.webkit){
window.webkit&&window.webkit.messageHandlers.mintouapp.postMessage('');}

12.7更新一个问题
当你有一个导航栏控制器,加载了ControllerA,然后Push到ControllerB(而这个B内嵌WKWebView,常规都会注入JS),然后你又Push到了ControllerC(也可以不Push),反正经过了一个WebView,这个时候你从顶部PopRoot,这个时候如果你不把WebView里面的JS移除掉,系统是不会让WebView Dealloc的,一般你手动左上角pop一层一层回去,自然你加了代码移除,就不会有问题,我的问题是,popRoot,不会触发左上角按钮的事件,我的做法是,如果Web跳转原生TabBar,需要切换,而且移除当前控制器所有VC,如果能顺利移除Web,必须加上通知,让Web手动调用移除JS的代码,才能正确Dealloc

- (void)backButtonPressed:(nullable id)sender{if (self.webView.canGoBack) {[self.webView goBack];}else{[self removeScriptMessageAll];[super backButtonPressed:sender];}
}- (void)removeScriptMessageAll{[self.webView removeScriptMessageHandlerForName:kWebViewScriptMessageHandlerLoginName];[self.webView removeScriptMessageHandlerForName:kWebViewScriptMessageHandlerTokenName];[self.webView removeScriptMessageHandlerForName:kWebViewScriptMessageHandlerUUIDName];
}- (void)dealloc{[self.webView stopLoading];self.webView.delegate = nil;[self.webView removeFromSuperview];[[NSNotificationCenter defaultCenter] removeObserver:self name:MTF_NOTIFICATION_LOGIN_CALLBACK object:nil];[[NSNotificationCenter defaultCenter] removeObserver:self];NSLog(@"dealloc--->%s",object_getClassName(self));
}

这里是常规的Pop,都能正常dealloc,如果PopRoot,不会触发ButtonBack的事件,因此需要通过通知的方式主动触发removeScriptMessageAll,不然这个Web是无法Dealloc的,记录一下,如果有更好的方式,朋友请留言

NSURLCache 为您的应用的 URL 请求提供了内存中以及磁盘上的综合缓存机制。 作为基础类库 URL 加载系统 的一部分,任何通过 NSURLConnection 加载的请求都将被 NSURLCache 处理。

当然系统有默认的,你也可以自己手动初始化并且给需要的大小以及存储沙盒地址,其实AFNetWorking里面就有

+ (NSURLCache *)defaultURLCache {return [[NSURLCache alloc] initWithMemoryCapacity:20 * 1024 * 1024diskCapacity:150 * 1024 * 1024diskPath:@"com.alamofire.imagedownloader"];
}

这里有个参数diskPath可以写也可以不写,如果默认不写,就是通过我们的BundleID进行路径存储的,如下图,就是默认WKWebView的缓存地址和文件,这两个WebKit的文件就是disk缓存

NSURLRequestCachePolicy

当WebView加载URL的时候有这个参数, cachePolicy 属性,它根据以下常量指定了请求的缓存行为

NSURLRequestUseProtocolCachePolicy: 对特定的 URL 请求使用网络协议中实现的缓存逻辑。这是默认的策略。

NSURLRequestReloadIgnoringLocalCacheData:数据需要从原始地址加载。不使用现有缓存。

NSURLRequestReloadIgnoringLocalAndRemoteCacheData:不仅忽略本地缓存,同时也忽略代理服务器或其他中间介质目前已有的、协议允许的缓存。

NSURLRequestReturnCacheDataElseLoad:无论缓存是否过期,先使用本地缓存数据。如果缓存中没有请求所对应的数据,那么从原始地址加载数据。

NSURLRequestReturnCacheDataDontLoad:无论缓存是否过期,先使用本地缓存数据。如果缓存中没有请求所对应的数据,那么放弃从原始地址加载数据,请求视为失败(即:“离线”模式)。

常量 意义
UseProtocolCachePolicy 默认行为
ReloadIgnoringLocalCacheData 不使用缓存
ReloadIgnoringLocalAndRemoteCacheData 我是认真地,不使用任何缓存
ReturnCacheDataElseLoad 使用缓存(不管它是否过期),如果缓存中没有,那从网络加载吧
ReturnCacheDataDontLoad 离线模式:使用缓存(不管它是否过期),但是从网络加载
ReloadRevalidatingCacheData 在使用前去服务器验证

清理缓存

如何不用缓存,每次请求最新的Web数据

方法1:NSURLRequestReloadIgnoringCacheData忽略缓存

- (void)loadNoCacheData{NSString *stringurl=[NSString stringWithFormat:@"http://www.baidu.com"];NSURL *url=[NSURL URLWithString:stringurl];NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:urlcachePolicy:NSURLRequestReloadIgnoringCacheDatatimeoutInterval:15.0];[_webView loadRequest:theRequest];
}

方法2:即使你用了默认缓存策略,如何清除缓存
NSURLCache是会缓存到内存中以及磁盘中的,那么就非常明确,需要两者都清除

- (void)clearWbCache{//    (NSHomeDirectory)/Library/Caches/(current application name, [[NSProcessInfo processInfo] processName])// 清除缓存[[NSURLCache sharedURLCache] removeAllCachedResponses];[[NSURLCache sharedURLCache] setDiskCapacity:0];[[NSURLCache sharedURLCache] setMemoryCapacity:0];// 清除磁盘(上面两句就是已经执行好了,下面只是一个思路)  路径来源可以看上面的图(不过这里)/*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];NSError *error;[[NSFileManager defaultManager] removeItemAtPath:webKitFolderInCaches error:&error];[[NSFileManager defaultManager] removeItemAtPath:webkitFolderInLib error:nil];*/}

首先,你要理解,这是最低支持iOS 8的解决方案,因为iOS 9以上有针对WKWebView的清缓存API,很显然上面的方法会有弊端。。。。。。以上方法,可以删除jsp的,但是不能删除HTML静态资源的那种,不知道是什么原因,反正我测试了一下,就是无法清除静态资源,反正无法清干净
html和jsp的区别–静态页面和动态页面的区别

iOS 9之后有了新的API

// 清除部分,可以自己设置
// NSSet *websiteDataTypes= [NSSet setWithArray:types];// 清除所有
NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes]; Date fromNSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0]; Execute[[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{// DoneNSLog(@"清楚缓存完毕");}];

如果最低支持iOS 9,那么用该方法就能完全清除干净,但是第一个为毛不能清除干净,具体知道的朋友可以留言告诉我

方法3:URL更新的时候带上版本号
其实每次你URL没有更新,但是你的内容已经更新了,由于缓存的原因,你还是只能读取缓存,这个时候你让地址都带上版本号,就能区别统一url下缓存了,或者在配置文件带上开关,是否需要清干净缓存访问最新的,一样的道理

WKWebView的缓存问题以及如何正确清理缓存相关推荐

  1. ios html清除缓存图片,iOS,如何清理缓存的图片

    通常,在我们加载图片的时候,一般都会做缓存处理,像SDWebImage,YYWebImage都是有的,但是有缓存,当然也需要清理缓存,如果没有这个功能的话,显得app太没人性化. 获取总的缓存大小 / ...

  2. linux缓存buffer,【Linux】清理缓存buffer/cache

    运行sync将dirty的内容写回硬盘 sync 通过修改proc系统的drop_caches清理free的cache echo 3 > /proc/sys/vm/drop_caches ech ...

  3. android app 清理缓存图片,支付宝APP怎么清理缓存 支付宝安卓版缓存清理方法

    当今社会支付方式已经越来越便捷化了,普通的现金支付方式已经逐渐被人们放弃,现在大部分朋友们都会使用支付宝APP进行手机移动支付.相信大家都知道,这款软件除了支付功能以外,还有许多其他功能,而这些功能往 ...

  4. android清理缓存功能吗,android实现清理缓存功能

    android之清理缓存实现,供大家参考,具体内容如下 一. 清理缓存首先要搞清楚清理哪些东西 1.app本身的功能比如录像,录音,更新都会产生文件,需要清理 2.app的默认缓存地址cache 二. ...

  5. python怎么清理垃圾和缓存_怎么才能正确清理电脑的缓存垃圾?

    笔者一直苦于某某卫士那些华而不实的功能和小广告,而且点开资源管理器一瞧,它占内存还挺大,东西,站着位子不做实事 笔者发出了怒吼:还笔者清爽的电脑! 但笔者又养成了清 理电脑垃圾的习惯,不清 理难受系列 ...

  6. 涨知识了!苹果手机清理缓存原来这么简单,一键就能清出几个G

    苹果手机的优点就是耐用和流畅,但是手机使用久了难免会有大量缓存垃圾,不仅会拖慢手机运行速度,还会占用手机的大量内存,今天笔者就给大家分享苹果手机该如何正确清理缓存垃圾! 使用过苹果手机的朋友都知道,苹 ...

  7. 无锡清空win8应用商店缓存_微软surface常用清理内存缓存解决办法

    微软surface定期清理垃圾文件和缓存文件 一.清理缓存步骤: 1.自动清理缓存的步骤:找到所有设置,系统,存储,将存储感知开启,或者更过释放空间的方式,进行相关设置. 2.手动清理缓存的方法: a ...

  8. Mac重启清理缓存会怎么样 mac清理缓存怎么清理

    众所周知,Mac电脑有着流畅的操作系统,因此,很多用户都会选择使用Mac电脑办公.随着日常使用,系统缓存数据越来越大,某些Mac电脑(尤其是小内存版本的Mac电脑)可能会出现"系统" ...

  9. linux清空buff,linux 清理缓存buff/cache

    清理缓存 echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/vm/drop_caches echo 3 > /proc/sys ...

最新文章

  1. Loadrunner中socket协议中的三个关联函数
  2. [高中作文赏析]相约
  3. (转)淘淘商城系列——使用solrj来测试索引库
  4. 人能为赚钱吃多少苦?
  5. 三极晶体管放大电路实验
  6. 强悍的 Linux —— tar.xz 文件的解压
  7. oracle xsql 详解(一)
  8. 电脑的USB口给手机充电为什么很慢
  9. vm虚拟机怎么连接wifi_win7下安装的vmware虚拟机怎么接入无线局域网实现网络互联互通-网络教程与技术 -亦是美网络...
  10. PDF限制复制怎么办?怎么解决这个问题?
  11. 一款优秀的中文识别库——ocr
  12. 计算机组成原理 全加器实验
  13. 实战--接入最坑的支付宝
  14. python实现百度语音合成(超详细!!)
  15. 学习笔记——共阳数码管的动态显示
  16. 樊登《创业,从发心到执行》课程学习总结
  17. 如何防御网站被ddos攻击 首先要了解什么是流量攻击
  18. 基因序列的保守性分值
  19. bug管理工具bugfree配置之一:php mysql apache 配置篇
  20. 王者荣耀改名神器助手微信小程序

热门文章

  1. 张晨卸任京东CTO,你意料否?
  2. 篮球杯2021年省赛
  3. 标准日本语第六课课件
  4. 使用多尺度patch合成来做高分辨率的图像复原
  5. 【吐血整理】(面试大全)网络安全,渗透测试,安全服务工程师面试题
  6. c语言之if语句商品优惠
  7. matlab编程实现二进制树搜索,binary-tree-collision-code 射频识别技术里的二进制树碰撞代码,防 能力 matlab 238万源代码下载- www.pudn.com...
  8. 你说2020年下半年股市行情怎么样?
  9. 网约车】 网约车管理解决方案
  10. Java开发实战讲解!java象棋游戏源代码