ios uiwebview wkwebview注意點小記

許佳佳233發表於2018-09-16

概述

wkwebview是蘋果公司推出的替代uiwebview的方案,它在記憶體佔用和穩定性方面有很大的優勢,效能對比此篇文章就不講了。
但是就目前情況而言,uiwebview還有有一些不能被完全替代的原因,比如wkwebview無法用NSURLProtocol攔截請求,因此無法通過NSURLProtocol實現載入離線化資源。
本文主要是記錄自己在使用的時候碰到的一些坑。

方法注入

uiwebview目前的方式就是直接通過JS定義方法,然後使用JSC來獲得JS方法的回撥。
wkwebview可以直接使用addScriptMessageHandler來新增需要監聽的方法,然後在userContentController中處理監聽事件。
主要的區別是,uiwebview的注入只對當前介面生效,在載入新的url或者介面重新整理後就會失效。而wkwebview的注入對整個wkwebview生效,介面重新整理不會對其有影響。
所以在uiwebview上如果有注入全域性方法的需求,通過直接執行JS程式碼注入不可行,一般可以使用攔截自定scheme和host的方式來做方法注入。

cookie

uiwebview的cookie與NSHTTPCookieStorage 同步,每次訪問都會帶上NSHTTPCookieStorage 中的內容,包括在頁面中輸入document.cookie也能獲取到NSHTTPCookieStorage 中的cookie。

wkwebview不是及時同步

但是wkwebview的cookie和NSHTTPCookieStorage 就不能及時同步,注意是不能及時同步,並不是不同步。主要體現在以下兩個方面:
1、當NSHTTPCookieStorage 的中的cookie被修改了,cookie是會同步到wkwebview的,但是不是及時同步的,比如說我修改了NSHTTPCookieStorage的值之後然後馬上開啟一個wkwebview,wkwebview不一定能獲取到我剛剛修改的cookie。
2、當我使用document.cookie在wkwebview中設定cookie的時候,我當前設定的cookie是會回寫到NSHTTPCookieStorage中,但是也不是及時的。

由於不及時同步,我們就說一下可能會有的問題,舉例兩個場景:
1、wkwebview沒有獲取到cookie,然後觸發登陸邏輯後修改NSHTTPCookieStorage 跳回wkwebview,這時候wkwebview很有可能還是沒有cookie的,因為wkwebview的cookie不是及時同步的。
2、某一模組為了滿足自己的需求,修改了NSHTTPCookieStorage 中的一個cookie,而這個cookie剛好和其他模組重名了,由於wkwebview會回寫cookie到NSHTTPCookieStorage 中,因此它會把原來這個名字的cookie給覆蓋掉。而不僅僅存在cookie的value被修改,導致其他模組cookie錯誤的的問題,如果expire被修改了,也同時會給其他模組帶去cookie過期的問題。

wkwebview對cookie的處理

目前網上的處理方法主要有以下兩種:
1、在webview發起請求的時候附帶cookie。
2、在webview建立的時候js注入cookie。

這兩個方法都能解決wkwebview不能及時同步NSHTTPCookieStorage 的問題,但是無法解決wkwebview的cookie修改後不能及時回寫到NSHTTPCookieStorage 的問題。
還是舉個例子:
第一個wkwebview中的JS修改了一段cookie之後,沒過多久又開啟了第二個wkwebview,第二個wkwebview是很可能獲取不到第一個wkwebview對cookie的修改的。最根本原因就是由於wkwebview的cookie無法及時回寫到NSHTTPCookieStorage 。

那麼這種情況如何解決呢?答案就是wkProcessPool。

WKProcessPool

使用同一個WKProcessPool的wkwebview可以共享cookie資料,但是WKProcessPool中的cookie並不和NSHTTPCookieStorage 一樣會本地儲存。在APP重啟後WKProcessPool中的cookie會被重置。

cookie仍然存在的問題

1、 第一個wkwebview中的JS修改了一段cookie之後,沒過多久又開啟了一個uiwebview,uiwebview如何能及時同步到wkwebview對cookie的修改?
2、如果某個模組在wkwebview中修改了cookie的值,導致NSHTTPCookieStorage 中的cookie被篡改或者過期,如何定位到該模組的問題?

本文參照:https://mp.weixin.qq.com/s/rhYKLIbXOsUJC_n6dt9UfA

如果對此塊內容有其他見解的小夥伴歡迎私信或者留言。

相關文章