Über die Synchronisation zwischen WKHTTPCookieStore und NSHTTPCookieStorage

1. Nach dem Code-Experiment teilt WKWebView in derselben APP einen WKHTTPCookieStore

Zweitens das Hinzufügen, Löschen, Ändern und Überprüfen von Cookies

  1. Neues Cookie: iOS muss beim Erstellen eines Cookies Name, Wert, Domäne und Pfad angeben, da sonst kein gültiges Cookie erstellt werden kann.

  2. Ändern Sie das Cookie: Domäne, Pfad, Name sind gleich, es wird mit der Änderung beginnen.

  3. Cookie löschen: Domain, Pfad, Name sind konsistent, beide werden gelöscht.

  4. 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

  5. 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

  1. 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.

  1. 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),则不会进行同步?

  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的

Ich denke du magst

Origin juejin.im/post/7117156886230597663
Empfohlen
Rangfolge