-(void)deleteCookieForDominPathStr:(NSString *)thePath
{
//删除本地cookie,thePath为cookie路径通过打印cookie可知道其路径
for(NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {
if([[cookie domain] isEqualToString:thePath]) {
[[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
}
}
}
当我听到这个需求时,我的内心是窃喜的.我想这岂不是超级简单,然而我没想的是这就是我入坑的第一步.\(o)/~
我的思路: 控制器VC,上面添加一个webveiw,然后[webveiw loadrequest:request];
准代理并且在这个代理方法
- - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
if (![request.URL.absoluteString {
NSURL * url = [NSURL
NSURLRequest * request = [NSURLRequest requestWithURL:url];
[webView loadRequest:request];
return NO;
}
return YES; }
实现URl修改,对就是这样.按照最开始的思路来看,就这么简单搞定啦.但是那因为我们不了解webview的运行机制.
313863A0-3CFB-402F-A8B3-3BB61E28B26A.png可以看一下,当我们试图加载一个网页时,webveiw的代理执行了几次,2次.
=那么问题来了,URL会对服务器请求几次啊.当然是两次.问题来啦:如果你的领导知道这个他们会怎样,干掉你
那我们再想一下为什么会请求两次呢
断断续续,好久了这片始终没找到好的切入点,感觉webveiw使用很简单,但是深入的资料很难查到,百度一搜,全部都是一样的表面使用.
后来想了好多办法用来防止两次请求,但是都失败.于是就想到了nsurlprotocol,想到了他,于是使用他,但是wkwebveiw,不支持nsurlprotocol,然后呢我又找到了兼容办法,就是调用私有接口(连接在上面),以为万事大吉啦,但是发现,他无法加载post,因为post的请求体无法发送到服务器,于是乎,数据显示不全.我就想,那就把post的请请求不让他执行nsurlprotocol,但是发现不好使.这时候呢,我就想那就用webveiw吧,耗内存,久耗内存吧,然后全部换成webveiw,这时候呢,除去post,以后还有页面请求URL,还有一些其他数据请求URL.我把全部数据打印了一下,发现有用的数据都含有一个.do.于是有用.do筛选一遍.这样呢,就可以在协议里面进行request重定向.对这些URL进行拼接参数.后来又发现问题,就是异步在这种请求下不好使,于是乎,又不能使用拼接参数.
接着能又换了方法,用cookie判断这样,就搞定啦
当然,还有就是这里面需要在nsurlprotocol中对vc进行从操作,使用的是通知中心的模式,而且注意是要在主线程发送通知.
还有就是在surlprotol中跳转原声界面也要在主线程中跳转,尤其是在页面使用了masary布局时,不然会报错.
目前这种靠拦截的做法是比较落后的,个人赶脚,也因为个人平时使用webview比较少,所以遇到很多坑
个人感觉对webveiw的深入理解还是少很多.
当然期间也遇到了很多问题,就是使用kvc修改webveiw的request属性,使用kvo监听request,同样也失败了,不知道是什么原因(求大神解释)
webview goback 刷新 正常情况下他是不支持返回刷新的,通过下面方法可以实现
id webView = [self.webview valueForKeyPath:@"_internal.browserView._webView"];
id preferences = [webView valueForKey:@"preferences"];
[preferences performSelector:@selector(_postCacheModelChangedNotification)];