WKWebView的快取策略不支援POST請求!!!

Crazy巴旦木發表於2018-08-29

由於最近在寫網頁快取和本地資源替換,在網頁進去的時候發現顯示不全的問題,用Charles發現引數沒傳,但是前端說傳了引數的,發現請求為POST請求,會不是是引數的原因呢,把請求改為了GET發現好了(但是get請求會有引數過長的問題,尤其是token),查了查資料WKWebView傳送POST請求之後,可以利用JS來動態的生成HTML裡的form標籤,然後用form表單來實現POST請求。我這裡使用了dsbridge第三方的互動框架,在接收到伺服器傳來的引數,域名,我打包成JS字串再傳給他。

至於為什麼在快取策略下不支援POST請求?
由於 WKWebView 在獨立程式裡執行網路請求。一旦註冊 http(s) scheme 後,網路請求將從 Network Process 傳送到 App Process,這樣 NSURLProtocol 才能攔截網路請求。在 webkit2 的設計裡使用 MessageQueue 進行程式之間的通訊,Network Process 會將請求 encode 成一個 Message,然後通過 IPC 傳送給 App Process。出於效能的原因,encode 的時候 HTTPBody 和 HTTPBodyStream 這兩個欄位被丟棄掉了。現在暫時沒有解決辦法,好像iOS11有了新的快取策略,等稍後研究。

PS:淚奔,原來發現不知道為什麼一下載音訊圖片資源就會清空快取,我以為是下載器的問題,後來沒有發現清除快取的程式碼。因為我的需求是攔截快取網頁的,裡面的背景圖都很大的,有時候看一兩個網頁離線之後發現快取沒了。找了找原因,原來是因為NSURLCache預設硬碟快取是10M,我的快取是全部快取,所以很快就超了自動清空,設定大了就好了。

相關文章