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
- Hybrid治理(UIWebView&WKWebView)UIWebView
- iOS UIScrollVIew UITableView UIwebView WKWebView 截全圖,生成全圖方法iOSUIWebView
- iOS 和 H5 互動那些事 (UIWebView、WKWebView 總結篇)iOSH5UIWebView
- iOS Cell巢狀UIWebView(內附UIWebView詳解)iOS巢狀UIWebView
- iOS - WKWebView CookieiOSWebViewCookie
- WKWebView的Cookie問題小記WebViewCookie
- iOS之WKWebView封裝iOSWebView封裝
- iOS--WKWebView Cookie注入iOSWebViewCookie
- Android與iOS測試注意點AndroidiOS
- iOS與JS互動之UIWebView-JavaScriptCore框架iOSJSUIWebViewJavaScript框架
- iOS中WKWebView互動使用總結iOSWebView
- iOS與JS互動之UIWebView協議攔截iOSJSUIWebView協議
- 簡單說說iOS之WKWebView的用法iOSWebView
- 寫小說主要注意的點
- PHP日常注意點-記錄1PHP
- iOS WKWebView H5微信支付跳轉iOSWebViewH5
- iOS開發基礎146-深入解析WKWebViewiOSWebView
- iOS開發-WKWebView的介紹與基本使用iOSWebView
- IOS小元件(7):小元件點選互動iOS元件
- iOS WKWebView的javascript alert 不彈的解決方案iOSWebViewJavaScript
- iOS訊息轉發小記iOS
- iOS安裝包瘦身小記iOS
- iOS開發:給UIWebview的導航欄新增返回、關閉按鈕iOSUIWebView
- [系列文章] PHP日常注意點 - 記錄2PHP
- mysql寫function時的注意點記錄MySqlFunction
- 學習 iOS Application Security 需要注意的一些點iOSAPP
- iOS開發小記-基礎篇iOS
- Dockerfile小記之使用RUN命令需要注意Docker
- WKWebView詳解&WKWebVieW和JS互動WebViewJS
- APP測試中IOS和Android的區別,有哪些注意點?APPiOSAndroid
- 生活點滴小筆記筆記
- ElasticSearch知識點小記Elasticsearch
- iOS小數點格式化:最多保留兩位小數,小數點後末尾的0不要iOS
- iOS 程式碼注意事項iOS
- jenkins 節點配置使用小記Jenkins
- 記錄的小知識點