关于WKHTTPCookieStore与NSHTTPCookieStorage同步问题

·  阅读 2472

一、经过代码实验同一个APP中的WKWebView都共用一个WKHTTPCookieStore

二、cookie的增删改查

  1. 新增cookie: iOS创建cookie时必须包含name,value,domain,path,否则无法创建有效cookie.

  2. 修改cookie: domain,path,name一致,既会开始修改.

  3. 删除cookie: domain,path,name一致,既会删除.

  4. 删除cookie的另外一种方式,就是修改cookie的exprieData设置为过期,则cookieStorage会将cookie删除

  5. 若cookie.exprieData=nil时,cookie为会话cookie,只会存活在本次APP生命周期中,杀死app后,cookie就会因为过期而从cookieStorage中删除

三、 NSHTTPCookieStorage与WKHTTPCookieStore的同步问题

  1. 首先明确一点,系统确实做了NSHTTPCookieStorage与WKHTTPCookieStore的同步,但是由于WKHTTPCookieStore的cookie操作都是在异步线程,所以从NSHTTPCookieStoreage同步到WKHTTPCookieStore时,会遇到两个问题:1.同步时机不确定 2.同步任务在异步线程

举个简单的列子:NSHTTPCookieStoreage对URL1新增/修改cookie1后,立刻使webView打开URL1,那么webView的请求时无法获取到新增/修改后的cookie1的。

  1. 我这里将所有同步事件进行逐一拆分

    2.1 NSHTTPCookieStorage新增cookie1: WKHTTPCookieStore能够同步到新增的cookie1,但时机并非同步,略有延迟大约在1s之内

    2.2 NSHTTPCookieStorage修改cookie1: WKHTTPCookieStore能够同步到修改的cookie1,但时机并非同步,略有延迟大约在1s之内

    2.3 NSHTTPCookieStorage与WKHTTPCookieStore都有cookie1,NSHTTPCookieStoreage删除cookie1: WKHTTPCookieStore删除cookie1的时机无法确定,有时能够删除,有时不能删除。但是我总结以下几种情况可做后续参考(WKHTTPCookieStore大概率删除cookie1):

     · NSHTTPCookieStoreage又进行了新增/修改cookie后(也不是立刻就更新,删除操作不顶用),等多个10s左右
    
     · 重启APP也会进行同步(但是也要注意,如果立刻重启APP的话,wk中cookie有可能还没有删除,所以重启后,wk还会将本来需要删除的cookie同步给NS)
    
     · WKHTTPCookieStore自己进行一次新增/修改/查找cookie操作之后(也不是立刻就更新,也得看NS和WK同步任务的线程繁不繁忙,而且WK查询次数太快,还会导致将本来已经删除的cookie同步到NS)
    复制代码

    2.4 WKHTTPCookieStore新增cookie1: NSHTTPCookieStorage立刻新增cookie1

    2.5 WKHTTPCookieStore修改cookie1: NSHTTPCookieStorage立刻修改cookie1

    2.6 WKHTTPCookieStore删除cookie1: NSHTTPCookieStorage立刻删除cookie1

总结: 我认为WKHTTPCookieStore删除cookie的时机比新增/修改cookie时机靠后的多,所以这种时机不确定且线程不同步的情况下会导致偶现的棘手问题:例如,NS和WK中都有cookie1,我在NS中删除了一个cookie1,然后我使用WK新增/修改cookie2操作,那么此时WK会将cookie2与cookie1都同步给NS中。所以现在一般要删除一个cookie的话都不会使用删除的方法,而是修改这个cookie.value = nil

四. 如果新增/修改的cookie.expireData=nil(即会话cookie),则不会进行同步?

  1. NSHTTPCookieStorage新增一个expireDta=nil的cookie1: NSHTTPCookieStorage中可以打印到cookie1(重启app后cookie1会被清除),而打印WKHTTPCookieStore中所有cookie时,是无法找到cookie1的

  2. NSHTTPCookieStorage与WKHTTPCookieStore都有cookie2,NSHTTPCookieStorage修改cookie2.expireDta=nil: 此时打印NSHTTPCookieStorage的cookies,里面可以找到cookie2,且cookie2.exprieData=nil。但是WKHTTPCookieStore的情况为,有可能cookie2没有发生变化,有可能打印不出来cookie2(因为过期而被删除了)

  3. WK新增一个expireDta=nil的cookie1: WK中可以打印到cookie1(重启app后cookie1会被清除),打印NSCookie中所有cookie时,是无法找到cookie1的

  4. WK与NS都有cookie2,WK修改cookie2.expireDta=nil: NS会立刻同步到修改后的cookie2,但是由于cookie2.exprieData=nil而认定为过期cookie,所以会从NSHTTPCookieStorage中删除

五. 如果新增/修改的cookie.expireData小于当前时间,那会怎么样?

  1. NSHTTPCookieStorage新增一个expireDta小于当前时间的cookie1: cookie1无法添加到NSHTTPCookieStorage,自然也无法添加到WKHTTPCookieStore

  2. NSHTTPCookieStorage与WKHTTPCookieStore都有cookie2, NSHTTPCookieStorage修改cookie2.expireDta小于当前时间: NSHTTPCookieStorage会将cookie2删除。而WKHTTPCookieStore的情况为:有可能cookie2没有变化,有可能打印不出来cookie2(因为过期而被删除了)

  3. WKHTTPCookieStore新增一个expireDta小于当前时间的cookie1: cookie1无法添加到WKHTTPCookieStore,自然也无法添加到NSHTTPCookieStorage

  4. NSHTTPCookieStorage与WKHTTPCookieStore都有cookie2, WKHTTPCookieStore修改cookie2.expireDta小于当前时间: WKHTTPCookieStore修改cookie2会删除cookie2, NSHTTPCookieStorage也会立刻删除cookie2

总结: 其实通过上面的案例可以归纳出:

  1. 从WKHTTPCookieStore同步到NSHTTPCookieStorage的cookie操作,都是安全的,及时的,因为NSHTTPCookieStorage的cookie操作在主线程操作

  2. 从NSHTTPCookieStorage同步到WKHTTPCookieStore的cookie操作,是不安全的,不及时的,因为WKHTTPCookieStore的cookie操作都为异步线程且时机也是无法控制的

彩蛋:

  1. 值得注意的是,就算是新建一个wkwebview然后wkwebView执行loadRequest方法后也不会立刻刷新NS和WK的同步。

  2. H5使用document.cookie会修改WKHTTPCookieStore的cookie,并且还能够及时同步到NSHTTPCookieStore

  3. webView.loadRequest是从WKHTTPCookieStore中获取cookie的

分类:
iOS
标签:
收藏成功!
已添加到「」, 点击更改