1. Nach dem Code-Experiment teilt WKWebView in derselben APP einen WKHTTPCookieStore
Zweitens das Hinzufügen, Löschen, Ändern und Überprüfen von Cookies
-
Neues Cookie: iOS muss beim Erstellen eines Cookies Name, Wert, Domäne und Pfad angeben, da sonst kein gültiges Cookie erstellt werden kann.
-
Ändern Sie das Cookie: Domäne, Pfad, Name sind gleich, es wird mit der Änderung beginnen.
-
Cookie löschen: Domain, Pfad, Name sind konsistent, beide werden gelöscht.
-
Eine andere Möglichkeit, ein Cookie zu löschen, besteht darin, die exprieData-Einstellung des Cookies so zu ändern, dass es abläuft, dann löscht cookieStorage das Cookie
-
Wenn cookie.exprieData=nil ist, ist das Cookie ein Session-Cookie und wird nur im aktuellen APP-Lebenszyklus überleben. Nach dem Beenden der App wird das Cookie aufgrund des Ablaufs aus cookieStorage gelöscht.
3. Synchronisation zwischen NSHTTPCookieStorage und WKHTTPCookieStore
- Zunächst einmal ist klar, dass das System NSHTTPCookieStorage und WKHTTPCookieStore synchronisiert , aber da sich die Cookie-Operationen von WKHTTPCookieStore in asynchronen Threads befinden, treten bei der Synchronisierung von NSHTTPCookieStoreage zu WKHTTPCookieStore zwei Probleme auf: 1. Der Zeitpunkt der Synchronisierung ist ungewiss. 2. Synchronisierungsaufgabe in asynchronem Thread
Um ein einfaches Beispiel zu geben: Nachdem NSHTTPCookieStoreage cookie1 zu URL1 hinzufügt/ändert und webView sofort veranlasst, URL1 zu öffnen, kann webView das neu hinzugefügte/geänderte cookie1 nicht abrufen, wenn es eine Anfrage stellt.
-
Ich werde hier alle Synchronisierungsereignisse einzeln aufteilen
2.1 Cookie1 zu NSHTTPCookieStorage hinzugefügt: WKHTTPCookieStore kann mit dem neu hinzugefügten Cookie1 synchronisieren, aber das Timing ist nicht synchronisiert und die leichte Verzögerung liegt innerhalb von 1 Sekunde
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),则不会进行同步?
-
NSHTTPCookieStorage新增一个expireDta=nil的cookie1: NSHTTPCookieStorage中可以打印到cookie1(重启app后cookie1会被清除),而打印WKHTTPCookieStore中所有cookie时,是无法找到cookie1的
-
NSHTTPCookieStorage与WKHTTPCookieStore都有cookie2,NSHTTPCookieStorage修改cookie2.expireDta=nil: 此时打印NSHTTPCookieStorage的cookies,里面可以找到cookie2,且cookie2.exprieData=nil。但是WKHTTPCookieStore的情况为,有可能cookie2没有发生变化,有可能打印不出来cookie2(因为过期而被删除了)
-
WK新增一个expireDta=nil的cookie1: WK中可以打印到cookie1(重启app后cookie1会被清除),打印NSCookie中所有cookie时,是无法找到cookie1的
-
WK与NS都有cookie2,WK修改cookie2.expireDta=nil: NS会立刻同步到修改后的cookie2,但是由于cookie2.exprieData=nil而认定为过期cookie,所以会从NSHTTPCookieStorage中删除
五. 如果新增/修改的cookie.expireData小于当前时间,那会怎么样?
-
NSHTTPCookieStorage新增一个expireDta小于当前时间的cookie1: cookie1无法添加到NSHTTPCookieStorage,自然也无法添加到WKHTTPCookieStore
-
NSHTTPCookieStorage与WKHTTPCookieStore都有cookie2, NSHTTPCookieStorage修改cookie2.expireDta小于当前时间: NSHTTPCookieStorage会将cookie2删除。而WKHTTPCookieStore的情况为:有可能cookie2没有变化,有可能打印不出来cookie2(因为过期而被删除了)
-
WKHTTPCookieStore新增一个expireDta小于当前时间的cookie1: cookie1无法添加到WKHTTPCookieStore,自然也无法添加到NSHTTPCookieStorage
-
NSHTTPCookieStorage与WKHTTPCookieStore都有cookie2, WKHTTPCookieStore修改cookie2.expireDta小于当前时间: WKHTTPCookieStore修改cookie2会删除cookie2, NSHTTPCookieStorage也会立刻删除cookie2
总结: 其实通过上面的案例可以归纳出:
-
从WKHTTPCookieStore同步到NSHTTPCookieStorage的cookie操作,都是安全的,及时的,因为NSHTTPCookieStorage的cookie操作在主线程操作
-
从NSHTTPCookieStorage同步到WKHTTPCookieStore的cookie操作,是不安全的,不及时的,因为WKHTTPCookieStore的cookie操作都为异步线程且时机也是无法控制的
彩蛋:
-
值得注意的是,就算是新建一个wkwebview然后wkwebView执行loadRequest方法后也不会立刻刷新NS和WK的同步。
-
H5使用document.cookie会修改WKHTTPCookieStore的cookie,并且还能够及时同步到NSHTTPCookieStore
-
webView.loadRequest是从WKHTTPCookieStore中获取cookie的