NSClassFromString;WKWebView与UIWebView的Cookie存取删除及同步

xiaoxiao2021-03-01  27

http://www.skyfox.org/ios-wkwebview-cookie-opration.html 经典

  1》cookie的使用场景-场景描述

我们以实际例子驱动的方式来开始这个话题。 实际例子描述:在App里内嵌一个UIWebView,通过UIWebView打开http://weibo.com 微博首页,在UIWebView里登录我的账号,登录成功后kill App,再次启动App打开UIWebView时微博仍为登录状态。 实现这个Demo的整体业务代码很简单,主要是怎么实现“再次启动App打开UIWebView时微博仍为登录状态”。这就涉及到UIWebView的cookie问题。Session、Cookie 客户端(包括浏览器)连接某网站(服务器)进行数据交换时,服务器给客户端分配一个数据交换的环境,保存着相关的状态(登录状态、记住用户名密码等),称之为会话即Session,每个Session都会有唯一的session id。 在客户端(包括浏览器)不断开连接的情况下这个session会一直在服务器保持着,直到连接断开或会话建立的过程长时间没有数据交换即超时。 Session是客户端第一次请求时在服务器创建的,Session维持的过程中(未断开连接),客户端肯定会发起多次数据请求,那么对同一服务器的多次请求时,服务器怎么知道各个请求是否是属于同一Sessioin的呢? 这时需要客户端的辅助,这个辅助机制称之为Cookie机制,浏览器的cookie机制都是这么做的,我详细说一下:客户端收到服务器的第一次响应时,服务器会把session id通过response返回给客户端, 客户端收到这个session id后把它存在客户端本地,以后客户端所有向服务器发起的请求都要带着这个session id, 这样服务器就知道这些请求都是属于同一个session,那么这些请求都可以共享这个Session状态(登录状态、记住用户名密码等)。 所谓Cookie就是存在本地的若干数据,如session id等其它一些需要临时存在本地以后请求需要的数据。 所以,一个Session对应一个session id,一个Session对应多个request, 一个request对应多个cookie,session id可以做为其中的一个cookie。另外,我们还会遇到浏览器的Cookie被禁用的情况(即浏览器不支持存cookie)。这种情况下,对网站的所有请求都必须在url里带着session id,以前是浏览器自动把session id放到请求的header里的。 对于这一点我就不深究了(http://blog.handy.wang/blog/2014/03/14/uiwebviewde-cookie/)

   2》 (UIWebView)UIWebView添加cookie的方法:通过NSHTTPCookie添加cookie用NSHTTPCookieStorage存储cookie,web请求时在自动添加

   WKWebView添加cookie的方法:WKUserScript和WKUserContentController添加cookie,需要手动添加(iOS的Cookie存取(UIWebView,WKWebView,AFNetworking)https://blog.csdn.net/ab351706354/article/details/60762071)

    3》(UIWebView)当你访问一个网站时,NSURLRequest都会帮你主动记录下来你访问的站点设置的cookie,如果 Cookie 存在的话,会把这些信息放在 NSHTTPCookieStorage 容器中共享,当你下次再访问这个站点时,NSURLRequest会拿着上次保存下来了的cookie继续去请求。原理是透过iOS提供的NSHTTPCookieStorage元件来控制所有从这个Application发出的HTTP Request,如果在UIWebview有使用iFrame或者AJAX发出的Request同样会受到影响,让cookie可以集中管理。cookie在所有应用之间共享并在不同进程之间保持同步。Session cookie(一个isSessionOnly方法返回YES的cookie)只能在单一进程中使用。2.1 request 设置cookie(NSHtttpCookie中设置cookie,在NSHTTPCookieStorage存储cookie),web请求时就不用再设置了。2.2清除cookie 2.3 webview清除缓存( iOS UIWebView的Cookie https://www.jianshu.com/p/bfd3dc34f807)

    uiwebview的cookie范围:所有进程:cookie在所有应用之间共享,除非cookie实例设置了sessionOnly即只在本应进程共享,且在所有进程间保持同步;NSHTTPCookieStorage管理cookie的单利对象;每个cookie都是NSHTTPCookie的实例;

    1、同步方式:自动同步;

    2、Uiwebview添加Cookie:[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:[NSHTTPCookie cookieWithProperties:params]](didFinishLaunchingWithOptions时添加到Storage)(https://blog.csdn.net/u014220518/article/details/50504152)

    3、uiwebview清除cookie:1》 [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie]; (退出登陆时删除Cookie)2》删除沙盒自动生成的Cookies.binarycookies文件  [NSHomeDirectory() stringByAppendingPathComponent:@"/Library/Cookies/Cookies.binarycookies"];[[NSFileManager defaultManager] removeItemAtPath:filePath error:nil](https://blog.csdn.net/u014220518/article/details/50504152)

   4、uiwebview获取cookie:NSURLConnection;AFNetworking;web加载完成时Http Response;[NSHTTPCookieStorage sharedHTTPCookieStorage].cookies(Storage取出UIWebView加载的适合设置HTTPHeader)(https://blog.csdn.net/u014220518/article/details/50504152)

 

1、创建cookie:NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:params];

2、获取cookieStorage:NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]

3、获取cookie:[NSHTTPCookieStorage sharedHTTPCookieStorage].cookies;

3、存储cookie:[cookieStorage setCookie:cookie]

 

   4》(UIWebView与WKWebView共享cookie即cookie同步)1 UIWebView内cookie同步:同一个应用,不同UIWebView之间的Cookie是自动同步的,Cookie在所有应用 之间共享并在不同进程之间保持同步Session Cookie(一个isSessionOnly方法返回YES的Cookie)只能在单一进程中使用。。它们都是保存在NSHTTPCookieStorage中。 当UIWebView加载一个URL的时候,在加载完成时候,这个URL response中包含的cookie会自动以NSHttpCookie的形式保存到 NSHTTPCookieStorage中。同时,如果在http response中,对cookie进行更新或者删除的话,其结果也会直接反应到NSHTTPCookieStorage 存储的cookie数据中。取出cookie数值,只要调用[NSHTTPCookieStorage sharedHTTPCookieStorage]即可。2 WKWebView内cookie同步:WKWebView的cookie并不会再加载url后自动保存到NSHTTPCookieStorage中。原因是因为现在WKWebView会忽视默认的网络存储, NSURLCache, NSHTTPCookieStorage, NSCredentialStorage。 目前是这样的,WKWebView有自己的进程,同样也有自己的存储空间用来存储cookie和cache, 其他的网络类如NSURLConnection是无法访问到的。 同时WKWebView发起的资源请求也是不经过NSURLProtocol的,导致无法自定义请求。同一个应用,不同WKWebView之间的cookie同步,可以通过使用同一个WKProcessPool实现cookie的同步。3  UIWebView和WKWebView之间cookie同步:可以通过javascript实现同步。 在上面说到的WKCookieSyncManager中,创建一个WKWebView实例,实现WKNavigationDelegate。 * 每次通过调用WKCookieSyncManager的setCookie方法的时候,先加载一个不存在的url,如http://{SERVER_HOST}/_fake. * 在webView:didFinishNavigation:中,如WKWebView实例将cookie转换成javascript。通过WKWebView的evaluateJavaScript 方法,设置cookie.

这里,SERVER_HOST最好使用服务器端想要设置的cookie的url host。而且要注意区别http和https,当NSHTTPCookieStorage使用 setCookies:forURL:mainDocumentURL:所使用的host和这里SERVER_HOST使用的host的scheme不一样的时候,有可能会出现cookie不能同步的现象。最后,要注意清除cookie的时候,不仅需要从NSHTTPCookieStorage中将cookie清除, 也需要将javascript同步的cookie清除。我采用的方法是重新设置一遍cookie,给它们 设置一个过期时间,然后会被webview自动无视(http://blog.sina.com.cn/s/blog_5bc079940102wsok.html)(http://www.skyfox.org/ios-wkwebview-cookie-opration.html)

 5》Wkwebview添加cookie:1、创建web时在WKUserScript中添加;2、加载某个url时添加cookie(在 [request addValue:cookieValue forHTTPHeaderField:@"Cookie”];)(3.AFN中添加(ios中wkwebview cookie设置https://blog.csdn.net/crackwl/article/details/52304739)wk不能通过AFN注入cookie)3.在web加载内容时js注入cookie( [webView evaluateJavaScript:@"document.cookie ='TeskCookieKey1=TeskCookieValue1';" completionHandler:^(id result, NSError *error) )注意:JS注入的Cookie,比如PHP代码在Cookie容器中取是取不到的, javascript document.cookie能读取到,浏览器中也能看到。NSMutableURLRequest 注入的PHP等动态语言直接能从$_COOKIE对象中获取到,但是js读取不到,浏览器也看不到,所以合理的办法让js,php,浏览器都能读取到相同的Cookie方法就是创建WebView的时候javascript注入Cookie,一开始发送NSMutableURLRequest请求的时候也要加上Cookie,并且保证两个地方的设置的cookie一致。(http://www.skyfox.org/ios-wkwebview-cookie-opration.html)

 

 

6》Wkwebview清除cookie: 1、清除全部cookies(WKWebsiteDataStore):ios9之后WKWebsiteDataStore清除cookie,注意:此操作将会清空cookies,类似浏览器里“清除记录”的功能。2、清除某域名下的cookies(WKWebsiteDataStore):如果是app的用户退出登录,需要清理的仅仅是自己家cookie(即某域名下)。比如我们现在app里退出登录,需要清理自己用户的的数据,而不是全部cookies。3、iOS9之前版本清除cookies(沙盒):在iOS9之前,wkwebview是没有清理cookie的方法的,所以需要对不同的版本进行不同的操作。那iOS9之前的如何操作?可以预见,既然是缓存,肯定是放在沙盒里的。找到沙盒的目录,删除文件即可。(WKWebview:与JS交互数据传值、Cookies的注入与清除(感觉交互写的乱,清除cookie比较有用,但是如果wkwebview清除cookie用WKWebsiteDataStore ,那WKHTTPCookieStore是WKWebsiteDataSource的属性)https://www.jianshu.com/p/c2a09a057306)

7》WKWebView Cookie 读取:1、通过NSHTTPURLResponse:因为cookie都存在http respone的headerfields,找到能获得respone的WKWebView回调,(- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler)2、WKWebsiteDataStore(ios9后)-  didFinishNavigation:(WKNavigation *)navigation;3、WKHTTPCookieStore (iOS11后)(http://www.skyfox.org/ios-wkwebview-cookie-opration.html此文中,NSHttpCookieStorage中没有cookie,可能是此类只适用于uiwebview,在WKHTTPCookieStore可能会取到,ios11后才有此类)

8》同一个应用wkwebview的cookie同步:

   1. WKWebView有自己的缓存机制,如果想同步session需要注意,使用全局的processPool

在WKNavigationDelegate代理方法中将cookie设置到本地;(decidePolicyForNavigationResponse,NSThhpRsponse获取,NSHTTPCookieStorage存储)在WKWebView加载请求的时候注入Cookie(web在loadrequest时加到httpfield中)经过以上几步已经可以同步Cookie了,第一次请求是没有jsessionid的,服务器会返回一个给你,然后我们在代理方法中的response中拦截并注入到本地,在下一次加载的时候再从本地取出并注入,从而达到同步Cookie的目的

 

(https://www.jianshu.com/p/7062916177ac)

总结:ios11添加了WKHTTPCookieStore类与NSHTTPCookieStore作用相似,都是对NSHTTPCookie进行管理,故ios11后wk与ui在cookie方面在以上对比过的各方面应当是一样的。

注:设NSHTTPCookieStorage(UIWebview)与WKHttpcookieStorage(ios11后出现wkwebview的cookie管理类)的cookie的数组元素的类型都是:NSHttpCookie

uiwebview与本地的cookie雨网上的cookie同步;wkwebview 本地的cookie雨网上的cookie同步;uiwebview与wkwebview的cookie同步;

Cookie的注入:web发请求时附带cookie;web创建时注入(wkwebview);web加载内容时,js注入?????

 

 

iOS11.3 WKWebView清除cookie所踩的坑!https://blog.csdn.net/u012413955/article/details/79783282

 

other

[iOS]WKWebView的使用--API篇https://mp.weixin.qq.com/s/ZvXlDG9EVOGtu9vvokOMeQ

WKWebView各类简介 https://www.jianshu.com/p/e5f2a9933bd0

 

9.6 

1、NSClassFromString 不管本控制器掉没掉到,只要工程中有这个类,NSClassFromString都有值(9月-test9.6) https://www.jianshu.com/p/db26770d8147

2、WKProcessPool 

  1>https://www.cnblogs.com/NSong/p/6489802.htmlwkwebview白屏:url被置空(借用webViewWebContentProcessDidTerminate方法解决);tittle被置为空

      2>web内容加载池,同一个应用,不同webview之间的cookie同步,可以通过使用同一个WKProcessPool实现cookie的同步。

3、web的cookie

   转:【WebView的cookie机制 】轻松搞定WebView cookie同步问题  https://www.cnblogs.com/wangfeng520/p/6861979.html

    iOS WebView带cookie请求URLhttps://www.aliyun.com/jiaocheng/353941.html

 

 

 

 

转载请注明原文地址: https://www.6miu.com/read-3450131.html

最新回复(0)