ios uiwebview wkwebview注意點小記
概述
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
如果對此塊內容有其他見解的小夥伴歡迎私信或者留言。
相關文章
- iOS UIWebView、WKWebView注入CookieiOSUIWebViewCookie
- iOS 中UIWebView與WKWebViewiOSUIWebView
- 【iOS開發】從UIWebView到WKWebViewiOSUIWebView
- UIWebview 與WKWebviewUIWebView
- 從 UIWebView 到 WKWebViewUIWebView
- 使用WKWebView替換UIWebViewWebViewUI
- Hybrid治理(UIWebView&WKWebView)UIWebView
- wkwebview和UIWebView除錯技巧WebViewUI除錯
- iOS UIScrollVIew UITableView UIwebView WKWebView 截全圖,生成全圖方法iOSUIWebView
- UIWebView/WKWebView對標籤攔截UIWebView
- iOS 和 H5 互動那些事 (UIWebView、WKWebView 總結篇)iOSH5UIWebView
- 比UIWebView更強大好用的WKWebViewUIWebView
- WKWebView的Cookie問題小記WebViewCookie
- iOS - WKWebView CookieiOSWebViewCookie
- iOS Cell巢狀UIWebView(內附UIWebView詳解)iOS巢狀UIWebView
- iOS H5容器的一些探究(一):UIWebView和WKWebView的比較和選擇iOSH5UIWebView
- iOS之UIWebView的坑iOSUIWebView
- iOS WKWebView的使用iOSWebView
- iOS WKWebView新增CookieiOSWebViewCookie
- iOS WKWebView 基本使用iOSWebView
- UIWebView的使用小結UIWebView
- iOS--WKWebView Cookie注入iOSWebViewCookie
- iOS之WKWebView封裝iOSWebView封裝
- IOS 進階之 WKWebViewiOSWebView
- 【ios】ios 對於wkwebview白屏問題iOSWebView
- iOS UIWebView記憶體暴漲問題的解決方法iOSUIWebView記憶體
- IOS開發系列——UIWebView專題iOSUIWebView
- iOS UIWebview仿微信進度條iOSUIWebView
- iOS-WKWebView 初步瞭解iOSWebView
- IOS中WKWebView 簡單使用iOSWebView
- Android與iOS測試注意點AndroidiOS
- ios-10 推送中注意的點iOS
- iOS WKWebView新增進度條02iOSWebView
- ios UIWebView 載入網頁、檔案、 htmliOSUIWebView網頁HTML
- iOS中WKWebView互動使用總結iOSWebView
- ios 如何獲取WKWebview錯誤資訊iOSWebView
- PHP日常注意點-記錄1PHP
- iOS與JS互動之UIWebView-JavaScriptCore框架iOSJSUIWebViewJavaScript框架