WKHTTPCookieStoreとNSHTTPCookieStorage間の同期について

1.コードの実験後、同じAPP内のWKWebViewはWKHTTPCookieStoreを共有します

第二に、Cookieの追加、削除、変更、および検査

  1. 新しいCookie:iOSには、Cookieを作成するときに名前、値、ドメイン、パスを含める必要があります。そうしないと、有効なCookieを作成できません。

  2. Cookieを変更します。ドメイン、パス、名前は同じで、変更を開始します。

  3. Cookieの削除:ドメイン、パス、名前に一貫性があり、両方が削除されます。

  4. Cookieを削除する別の方法は、CookieのexprieData設定を変更して期限切れにすることです。その後、cookieStorageはCookieを削除します。

  5. cookie.exprieData = nilの場合、CookieはセッションCookieであり、現在のAPPライフサイクルでのみ存続します。アプリを強制終了した後、Cookieは有効期限が切れたためcookieStorageから削除されます。

3.NSHTTPCookieStorageとWKHTTPCookieStore間の同期

  1. まず、システムがNSHTTPCookieStorageとWKHTTPCookieStoreを同期することは明らかですが、WKHTTPCookieStoreのCookie操作は非同期スレッドであるため、NSHTTPCookieStoreageからWKHTTPCookieStoreに同期するときに2つの問題が発生します。1。同期のタイミングが不確実です2。非同期スレッドでの同期タスク

簡単な例を挙げます。NSHTTPCookieStoreageがcookie1をURL1に追加/変更し、すぐにwebViewにURL1を開かせた後、webViewは要求時に新しく追加/変更されたcookie1を取得できません。

  1. ここでは、すべての同期イベントを1つずつ分割します

    2.1 NSHTTPCookieStorageにcookie1を追加:WKHTTPCookieStoreは新しく追加されたcookie1と同期できますが、タイミングは同期されておらず、わずかな遅延は1秒以内です。

    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的

おすすめ

転載: juejin.im/post/7117156886230597663