243516.com-色综合天天综合网天天看片 ,性欧美欧美巨大69,国产精品a久久久久久,欧美精品一区二区久久婷婷

首頁 - IOS編程

WKWebView 加載生命周期與代理方法剖析

1. 前言

從 WebView 開始加載一條請求,到頁面完整呈現這一過程發生了什么?無論是做 WebView 性能優化還是異常問題監控與排查,我們都離不開對這一問題的思考與探索。

2. iOS端WebKit加載框架

三大進程間通信關系圖

如上圖所示,說明了 UIProcess、WebContent、NetworkProcess 三大進程間的通信關系,并列舉了他們的主要職責。本系列的源碼剖析工作始終圍繞三大進程,對其作進一步說明:

  • NetworkProcess進程:主要負責網絡請求加載,所有的網頁共享這一進程。與原生網絡請求開發一致,NetworkProcess 也是通過封裝的 NSURLSession 發起并管理網絡請求的。但不同的是,這一過程中有較多的網絡進度的回調工作以及各類網絡協議管理,比如資源緩存協議、HSTS 協議、cookie 管理協議等。

  • WebContent進程:主要負責頁面資源的管理,包含前進后退歷史,pageCache,頁面資源的解析、渲染。并把該進程中的各類事件通過代理方式通知給 UIProcess。

  • UIProcess進程:主要負責 WebContent 進行交互,與 APP 在同一進程中,可以進行 WebView 的功能配置,并接收來自 WebContent 進程的各類消息,配合業務代碼執行任務的決策,例如是否發起請求,是否接受響應等。

理解了三大進程的主要工作職責后,接下來,我們首先結合三大進程描述 WebKit 從網絡加載到渲染的全流程,讓讀者對網頁加載有一個宏觀上的理解。

3. iOS端WebKit加載流程

我們使用如下方法,從 UIProcess 層通過 loadReqeust 方法發起頁面加載請求(此處 request 只能是 get 請求,如果配置為 post 請求,WebKit 內核基于性能考慮,在跨進程傳輸時,會將 body 數據丟棄,導致異常)。

[self.webView loadRequest:request];

通過跟蹤 WebKit 源碼,我們提取核心步驟如下:

  1. UIProcess 中的 loadRequest 首先會觸發 NetworkProcess 進程創建,然后通過進程間通信的方式將 request 發送給 NetworkProcess 進程進行 preconnect 預鏈接操作,通過網絡三次握手建立 TCP 鏈接,以便加快后續網絡資源請求速度。

  2. UIProcess 通過進程間通信的方式將 request 發送給 WebContent 進程,WebContent 進程創建 DocumentLoader 加載器加載網絡請求,并取消上個頁面的所有還在加載的請求,然后通過字典綁定當前頁面ID與創建好的 NetworkProcss 進程(便于服務端數據返回時,查找數據回填所對應的頁面),最終將請求交付給 NetworkProcess 中的 NSURLSession 進行處理。

  3. NetworkProcess 通過 NSURLSession 復用之前 preconnect 預鏈接,繼續進行網絡加載,此時等待網絡請求返回,網絡層會繼續將數據通過進程間通信方式傳輸給 WebContent 進程進行處理,開始流式進行數據解析,一邊接收一邊處理,進行詞法分析、語法分析,并在這一過程中加載解析出來的 js、css、圖片、字體等子資源,最終動態的生成(DOM 樹與 CSSOM 樹合成)渲染樹,在這一過程中,每次接受到新數據導致渲染樹有變更后,就會觸發一次 checkAndDispatchDidReachVisuallyNonEmptyState 方法,檢查當前頁面是否達到上屏狀態,若達到上屏狀態就進行上屏渲染。

達到上屏狀態的條件如下:

  1. 如果返回的 data 是普通文本文字,或返回的數據中包含普通文本文字,那只需要達到非空200字節即可以觸發上屏渲染;

  2. 如果返回的 data 是圖片資源類,則判斷像素大小 > 32*32,即可觸發上屏渲染;

  3. 如果不滿足以上條件,對于主文檔,判斷后面是否繼續接收數據,如果不繼續,則觸發上屏渲染;如后續還有數據,則循環上述流程直至觸發上屏。渲染完成,整個加載過程結束。

WebKit加載流程

對首屏渲染感興趣的同學可以嘗試配合服務端來針對部分場景(例如文字、圖片)做一些數據分包優化,或許會有一些不錯的收獲。

在描述完網頁核心加載過程后,為了更貼近我們日常的開發工作,接下來我們將重點描述以上工作流程如何與 UIProcess 進程(APP 進程)關聯起來。

4. 加載生命周期代理方法

4.1 WKNavigationDelegate 方法簡要介紹

  1. @protocol WKNavigationDelegate <NSObject>
  2. @optional
  3. // 請求之前,決定是否要跳轉:用戶點擊網頁上的鏈接,需要打開新頁面時,將先調用這個方法。
  4. - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
  5. // 頁面開始加載時調用
  6. - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(null_unspecified WKNavigation *)navigation;
  7. // 接收到響應數據后,決定是否跳轉
  8. - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler;
  9. // 主機地址被重定向時調用
  10. - (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(null_unspecified WKNavigation *)navigation;
  11. // 當開始加載主文檔數據失敗時調用
  12. - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error;
  13. // 當內容開始返回時調用
  14. - (void)webView:(WKWebView *)webView didCommitNavigation:(null_unspecified WKNavigation *)navigation;
  15. // 頁面加載完畢時調用
  16. - (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation;
  17. // 當主文檔已committed時,如果發生錯誤將進行調用
  18. - (void)webView:(WKWebView *)webView didFailNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error;
  19. // 如果需要證書驗證,進行驗證,一般使用默認證書策略即可
  20. - (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *__nullable credential))completionHandler;
  21. // 9.0才能使用,web內容處理中斷時會觸發,可針對該情況進行reload操作,可解決部分白屏問題
  22. - (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView NS_AVAILABLE(10_11, 9_0);
  23. @end

以上是 WKNavigationDelegate 代理方法及蘋果官方接口描述,足夠應付日常的開發工作了,但細節描述上有些粗糙,不能讓我們寫出踏實放心的代碼,因此我們需要徹底理解這些方法背后的運行邏輯。接下來,我們將結合實踐與源碼調試對重點方法進行剖析。

4.2 深入理解 WKNavigationDelegate 方法

WKNavigationDelegate代理方法調用流程

如上圖所示,描述了 WKNavigationDelegate 代理方法的調用流程,我們將在該圖的基礎上,重點描述帶顏色標注的代理方法,如下:

1)decidePolicyForNavigationAction 剖析

如第3節講述的網頁加載流程,當 WebContent 即將創建 DocumentLoader 加載器時,會首先觸發 decidePolicyForNavigationAction 代理方法。如果我們選擇 cancel ,那么瀏覽內核會完全忽略這一操作,后續也不再繼續執行其他操作,我們可以放心的使用 cancel 取消掉我們不想加載的主文檔請求,而無需擔憂任何異常。但當我們選擇 alllow 后,我們會進入一個稍微復雜的邏輯判斷,內核代碼首先判斷該該鏈接是否是 universalLink 類型的鏈接,如果判斷是 universalLink 類型的鏈接,會嘗試去調起三方 app,如果能調起,則會 cancel 當前請求,否則才會走到正常的網絡加載邏輯(如果需要統計 universalLink 調起情況與或建設屏蔽能力,可以再仔細閱讀該處源碼)。

2)didStartProvisionalNavigation 理解

decidePolicyForNavigationAction 方法中選擇 allow 并且判斷為非 universalLink 鏈接后,會立即觸發 didStartProvisionalNavigation 方法,表示即將開始加載主文檔。這個方法看似只是對 decidePolicyForNavigationAction 方法的確認,但是值得思考的問題是方法名中的 Provisional 究竟是什么意思。其實,頁面開始頁面加載后為了更好的區分加載的各階段,會將網絡加載的初始階段命名為臨時狀態,此時的頁面是不會記入歷史的,直到接收到首個數據包,才會對當前頁面進行 committed 提交,并觸發didCommitNavigation 方法通知 UIProcess 進程該事件,同時將網絡 data 提交給 WebContent 進行渲染樹生成。我們可由此引申出下一個問題,即 didFailProvisionalNavigation 與 didFailNavigation 的關系。

3)didFailProvisionalNavigation 與 didFailNavigation 的分別在什么時候執行?他們之間有什么關系?

當 NetworkProcess 進程發生網絡錯誤時,錯誤首先由 NSURLSession 回調到 WebContent 層。WebContent 會判斷當前主文檔加載狀態,如果處于臨時態,則錯誤會回調給 didFailProvisionalNavigation 方法;如果處于提交態,則錯誤會回調給 didFailNavigation 方法。

主文檔加載狀態圖

4)didFinishNavigation 究竟什么時候執行?與頁面上屏是否有關?

在上面的描述中,我們已經理解了 NetworkProcess 層也是使用 NSURLSession 加載主文檔的。當 NSURLSession 接收到 finish 事件時,會將該消息通過進程通信方式傳遞給 WebContent 進程,WebContent 進程再傳遞給 UIProcess 進程,直到被我們的代理方法響應。因此 didFinishNavigation 在 NSURLSession 的網絡加載結束時就會觸發,但因為跨了兩次進程通信,因此對比網絡層,實際上是有一定的延遲的。與子資源加載和頁面上屏無時間先后關系。

5. Tips

  • 一定要緊密結合三大進程去理解 WebKit 源碼,形成基于進程的知識體系。

  • 可以直接修改源碼驗證猜想。例如在驗證觸發渲染條件時,可以在源碼中禁止網絡層 didfinish 事件執行,并自己構造數據返回,驗證各類上屏觸發條件。

243516.com-色综合天天综合网天天看片 ,性欧美欧美巨大69,国产精品a久久久久久,欧美精品一区二区久久婷婷
欧美美女激情18p| 亚洲男人都懂的| youjizz久久| 亚洲精选一二三| 欧美日韩精品一区二区天天拍小说| 日欧美一区二区| 久久免费电影网| eeuss鲁片一区二区三区在线看| 亚洲欧美日韩中文播放| 欧美日韩视频第一区| 国产在线视频精品一区| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 91色视频在线| 日本欧美一区二区| 国产亚洲一区二区三区在线观看| 99综合电影在线视频| 亚洲va欧美va天堂v国产综合| 欧美成人精品3d动漫h| 不卡一卡二卡三乱码免费网站| 一区二区三区丝袜| 精品剧情在线观看| 色悠悠久久综合| 久久国产视频网| 亚洲色欲色欲www| 日韩亚洲国产中文字幕欧美| 成人深夜在线观看| 亚洲成在线观看| 国产亚洲成年网址在线观看| 色噜噜狠狠色综合中国| 捆绑紧缚一区二区三区视频| 国产精品美女久久久久久久网站| 欧美精品丝袜中出| 成人午夜电影小说| 全国精品久久少妇| 国产精品护士白丝一区av| 欧美精品aⅴ在线视频| 粉嫩av一区二区三区在线播放| 日韩中文字幕av电影| 日韩一区日韩二区| 亚洲精品一区二区三区99| 在线视频国内一区二区| 国产精品亚洲一区二区三区在线 | 国产传媒久久文化传媒| 亚洲va在线va天堂| 亚洲欧洲精品天堂一级 | 亚洲国产高清不卡| 91精品一区二区三区久久久久久| voyeur盗摄精品| 久久99久久久久| 亚洲午夜久久久久中文字幕久| 国产欧美日韩在线视频| 91精品国产综合久久久久久久久久| 成a人片亚洲日本久久| 久久99蜜桃精品| 天天综合日日夜夜精品| 亚洲色图欧美在线| 国产日韩欧美不卡在线| 欧美成人免费网站| 欧美日本一道本| 91麻豆国产自产在线观看| 国产精品91一区二区| 蜜臀久久99精品久久久画质超高清 | 国产清纯美女被跳蛋高潮一区二区久久w| 欧美日韩高清一区二区不卡| 一本一道久久a久久精品综合蜜臀| 国产精品一区二区不卡| 日韩中文字幕1| 亚洲bt欧美bt精品| 亚洲狼人国产精品| 国产精品久久二区二区| 国产免费成人在线视频| 精品播放一区二区| 91精选在线观看| 欧美美女激情18p| 欧美视频在线播放| 色哟哟国产精品免费观看| 成人av电影在线观看| 国产精品一区二区久久不卡 | 狠狠色丁香婷婷综合| 免费在线观看视频一区| 日韩国产一二三区| 午夜欧美视频在线观看| 亚洲国产精品久久久久婷婷884| 一个色综合网站| 亚洲免费伊人电影| 亚洲欧美日韩人成在线播放| 国产精品对白交换视频 | 成人福利电影精品一区二区在线观看| 国产乱对白刺激视频不卡| 国产毛片精品视频| 国产中文一区二区三区| 国产露脸91国语对白| 国产精品2024| 成人免费福利片| 国产**成人网毛片九色 | 一区二区欧美视频| 一区二区三区美女视频| 一区二区三区精品在线| 一区二区三区精品在线| 亚洲成a人片在线观看中文| 亚洲6080在线| 日韩不卡在线观看日韩不卡视频| 日韩av在线免费观看不卡| 蜜桃久久精品一区二区| 久久99精品久久久久久久久久久久 | 国产视频不卡一区| 国产精品毛片久久久久久久| 1024精品合集| 一区二区三区中文字幕在线观看| 亚洲在线视频一区| 亚洲va韩国va欧美va| 日本在线不卡视频| 久久精品99国产精品日本| 国产一区二区毛片| 成人一级视频在线观看| 91亚洲国产成人精品一区二三| 在线亚洲免费视频| 在线电影一区二区三区| 精品av久久707| 中文字幕第一区| 樱花草国产18久久久久| 亚洲电影你懂得| 久久精品国产精品青草| 成人理论电影网| 91久久国产最好的精华液| 欧美高清视频在线高清观看mv色露露十八| 日韩一区二区三区四区五区六区| 精品sm捆绑视频| 亚洲欧美日韩在线播放| 调教+趴+乳夹+国产+精品| 韩国欧美一区二区| av亚洲精华国产精华精| 欧美性生活久久| 精品福利在线导航| 亚洲欧洲一区二区在线播放| 亚洲大片精品永久免费| 黄页网站大全一区二区| 91在线精品秘密一区二区| 欧美老人xxxx18| 久久久久久久久久久久电影| 亚洲三级免费观看| 亚洲二区在线观看| 国产一区不卡在线| 色哟哟一区二区在线观看| 日韩欧美在线观看一区二区三区| 中文字幕成人av| 亚洲成人在线网站| 国产精品18久久久| 欧美唯美清纯偷拍| 久久久久久久久久久久电影| 一区二区欧美视频| 国产露脸91国语对白| 欧美体内she精视频| 国产偷国产偷精品高清尤物| 亚洲综合一区二区三区| 国产一区免费电影| 欧美色国产精品| 国产精品天干天干在观线| 亚洲国产精品久久久男人的天堂| 国产成人自拍网| 欧美日韩国产另类不卡| 中文字幕国产一区二区| 日韩成人一级大片| 99精品一区二区| 日韩欧美国产电影| 亚洲黄色av一区| 国产美女主播视频一区| 欧美日韩国产天堂| 国产精品久久久久久久久久久免费看| 日本不卡一区二区三区 | 在线精品观看国产| 国产日产欧美一区二区视频| 日本美女视频一区二区| 色香蕉成人二区免费| 国产性做久久久久久| 天涯成人国产亚洲精品一区av| a级精品国产片在线观看| 日韩视频中午一区| 亚洲综合色区另类av| 成人午夜av在线| 精品国产一区二区国模嫣然| 亚洲成av人片一区二区梦乃| av激情亚洲男人天堂| 精品国产乱码久久久久久影片| 亚洲一区二区五区| av电影一区二区| xnxx国产精品| 日本不卡1234视频| 欧美日韩一区三区| 亚洲精品高清视频在线观看| 国产成人自拍高清视频在线免费播放| 日韩一区二区三区电影在线观看 | 精品一二线国产| 欧美高清视频一二三区 | 99久久免费视频.com| 久久久久久久电影| 激情深爱一区二区| 欧美电影免费观看高清完整版在| 天涯成人国产亚洲精品一区av| 在线看一区二区|