精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

iOS 端容器之 WKWebView 那些事

網絡
熟悉 iOS\macOS Hybrid 混合開發的同學應該都有體會,WKWebView 雖然是蘋果作為替代 UIWebView\WebView 而推出的"新"組件,但大部分開發者對它實在“愛不起來”。畢竟對于國內大部分應用開發者來說,在實際使用中 WKWebView 所謂的“優勢”未必能體現出來,但帶來的“坑”卻都著實都不淺。

 [[413463]]

一 背景

熟悉 iOS\macOS Hybrid 混合開發的同學應該都有體會,WKWebView 雖然是蘋果作為替代 UIWebView\WebView 而推出的"新"組件,但大部分開發者對它實在“愛不起來”。畢竟對于國內大部分應用開發者來說,在實際使用中 WKWebView 所謂的“優勢”未必能體現出來,但帶來的“坑”卻都著實都不淺。

目前社區或線上可查找的 WKWebView 相關資料,大多比較陳舊且人云亦云、復制粘貼類的居多。少部分真實實踐和探索的開發者,或許也因時間或精力的原因,對問題和解決方案未能做詳細的闡述。導致目前線上 WKWebView 相關的資料數量不少、但質量不高;且有不少文章存在對問題的背景解釋不清,解決方案缺乏有效驗證等問題。

我從事端容器領域開發多年,曾在生產環境方案設計上與 WKWebView "對抗"多次。目前混合開發已經是現代 App 標配,一方面是對這么長時間用法經驗上的總結,另外一方面也希望能夠為還在抗爭中的同學提供一些新視角或者解決思路,故準備結合 WebKit 部分源碼,將自己對這個組件的理解以及部分問題解決方案整理分享一下。本文嘗試說明 3 件事情:

WKWebView 使用中的典型問題有哪些

為什么會出現這些問題

這些問題的解決辦法有哪些

二 基礎回顧

iOS 端網絡設計和 WKWebView 設計特點我們可以通過官方資料來查閱。但為了后面更好的說明問題,下面我們重點回顧下與文章后續內容相關的兩個基本知識點:

iOS 端網絡設計與 Cookie 管理

WKWebView 多進程模型

1 iOS 網絡設計與 Cookie 管理

Cookie 管理是做混合開發過程中經常會涉及到的部分,在應用開發中我們知道可以通過 NSHTTPCookie 和NSHTTPCookieStorage 來管理應用的 Cookie。但在系統層面 Cookie 是如何管理的、如何與網絡層各模塊進行聯動,這對我們后面分析WKWebView 中的 Cookie 問題有著至關重要的聯系。

根據官方資料,我們可知 iOS 平臺下網絡相關模塊大概關系如下:

從上至下模塊依次為:

WebKit:應用層,客戶端 App 以及 WKWebView 處于這一層。
NSURL:可以理解為對底層 CF 接口的封裝擴展層,NSURLConnection、NSURLSession 等處于這一層。
CFNetwork:iOS 網絡模塊核心實現層,是網絡層設計中最重要的部分。負責網絡協議組裝發送接收等主要工作,與 CoreFoundation 框架關系緊密。
BSD socket:基于底層硬件接口的 socket 服務。
CFNetwork 是整個網絡系統的核心模塊,負責組裝請求、處理響應等:

核心內容包含:

CFURLRequest:包括 URL/header/body 這些請求的信息。CFURLRequest 會進一步轉換成 CFHTTPMessage。
CFHTTPMessage:主要是 HTTP 協議的定義和轉換,把每一個請求 request 轉換成標準的 HTTP 格式的文本。
CFURLConnection:主要是處理請求任務。包括 pthread 線程、CFRunloop、請求隊列的管理等等。提供了start、cancel 等等操作的 API。
CFHost:負責 DNS,有 CFHostStartInfoResolution 等函數,基于 dns_async_start 和 getaddrinfo_async_start 等方法。
CFURLCache/CFURLCredential/CFHTTPCookie:處理 緩存/證書/cookie 相關的邏輯,都有對應的NS類。
從上面分析可知關鍵信息:iOS Cookie 管理相關模塊處于 CFNetwork 這一層中。即對于請求 Response 中的 "set-cookie" 字段,在 CFNetwork 中被消費和處理。

2 WKWebView 多進程模型

通過官方資料,我們知道 WKWebView 相比 UIWebView 很大的一個變化是"多進程模型":

WKWebView 在運行時,核心模塊運行在獨立進程中,與 App 進程獨立。

WKWebView 使各種問題的原因,有不少和多進程運行模式有很大的關系。

多進程模型詳解

但具體是什么樣形態的多進程?我們通過一張簡圖來說明下:

WKWebView(WebKit) 包含 3 種進程:UI Process, Networking Process, WebContent Process。
UI Process:即 App 進程,WKWebView(WebKit) 中部分模塊運行在此進程,會負責啟動其它進程。
Networking Process:即網絡模塊進程,主要負責 WKWebView 中網絡請求相關功能;此進程 App 中只會有啟動一次,多個 WKWebView 間共享。
WebContent Process:即 Web 模塊進程,主要負責 WebCore, JSCore 相關模塊的運行,是 WKWebView 的核心進程。此進程在 App 中會啟動多次,每個 WKWebView 會有自己獨立的 WebContent 進程。
各個進程之間通過 CoreIPC 進程通信。
總的來說:在一個客戶端 App 中,多個 WKWebView 使用中會共享一個 UI 進程(與 App 進程共享)、共享一個 Networking 進程、每個 WKWebView 實例獨享一個 WebContent 進程。

示例:

此處關于 WebContent Process 和 Networking Process 的啟動規則,官方文檔并未解釋特別清楚,且因為版本迭代等原因,文檔與目前最新規則也略有出入。為避免混淆與歧義,下面結合 WebKit 源碼稍作分析。

WebContent 進程啟動規則

根據官方文檔描述:

A WKProcessPool object represents a single process that WebKit uses to manage web content. To provide a more secure and stable experience, WebKit renders the content of web views in separate processes, rather than in your app’s process space. By default, WebKit gives each web view its own process space until it reaches an implementation-defined process limit. After that, web views with the same WKProcessPool object share the same web content process.

規則是優先使用創建新進程,當進程上線超過某閾值之后則會共享,在 WebKit 內部由 maximumProcessCount 控制。但是此規則只對 iOS13 之前的系統生效,iOS13 之后的系統,WKWebView 每次創建實例都會啟動一個新的 WebContent Porcess。相關實現如下。

iOS13 前:

iOS 13 及以后:

Networking 進程啟動規則

Networking 規則相對簡單,確保在 App 生命周期內啟動一例(Crash 之后會重新創建)。相關代碼:

三 主要問題與解決方案

WKWebView 在生產環境使用中,除去相對簡單的使用和適配問題外,容易對開發者和前端同學造成困擾的問題有 4 個:

請求代理問題
Cookie 管理問題
全面屏適配問題
WebContent 進程崩潰問題
下面分別對這 4 例問題產生的原因、可嘗試的解決方案以及不同方案下引入的問題做一下說明。

1 請求代理問題

這一點應該是阻礙 WKWebView 鋪開的首要問題。問題背景也相對簡單,并非有什么技術實現上的難度,而是蘋果官方不希望 WKWebView 請求被應用攔截,美其名曰"為了安全"。但在實際使用場景中,我們又需要對 WebView 的請求進行代理以滿足業務和性能訴求,典型場景如:離線包、流量監控等。

官方不支持、業務上又有使用場景,我們只能嘗試通過"黑魔法"來解決。目前適用面比較多的解決方案有兩個:

通過 [WKBrowsingContextController registerSchemeForCustomProtocol:] 來注冊代理,為方便簡稱為代理方案1。
通過 [WKWebViewConfiguration setURLSchemeHandler:forURLScheme:] 來注冊,為方便簡稱為代理方案 2。
目前兩種解決方案的實現方法都有較為豐富的資料和說明,在此不在贅述。

雖然這兩種方案某種程度上可以"部分解決問題",但帶來的副作用相對也不少,在生產環境中如何取舍還需具體開發同學來取舍。下面分別通過 "代理方案1" 和 "代理方案2" 代指來簡單說明下,可以供大家選型時做一個參考。

代理方案 1

此為最早出現的 WKWebView 請求代理方案,可滿足 iOS 9 及以后應用使用(目前最新為 iOS 14)。根據之前調研分析,業界大部分有代理需求的 App 采用此方案或變種方案。

1)方案思路

通過 WKBrowsingContextController 將 http(s) 注冊到 Networking 的 m_registeredSchemes 數組中。對于數組中的 Scheme,WebKit 在發起請求時會通過 WKCustomProtocol 將請求發送到 App 所在的進程,并由 App 進程來執行發送。

由于從 Networking 進程將數據發送到 App 進程時,WebKit 內有意剝離了 Body 部分(見 WebCoreArgumentCodersMac.mm):

故需要對攜帶 body 的請求做一些特殊處理。處理方案是通過在 WKWebView 內注入腳本,重寫掉 WebView 內請求發送相關方法。在請求發送之前將 body 部分序列化之后通過 bridge 傳遞到 App 進程暫存。

App 進程代理 WKWebView 請求時,根據規則按需拼接緩存的 body,完成之后再進行發送動作。

2)方案弊端

此方案雖然適用面較廣,但是弊端也很明顯。主要有兩方面:

(1)問題一:無法定向處理、只能一刀切即如果 App 采用此方案,對其所有 WKWebView 實例的發送的請求都需要代理。如果有 WKWebView 實例中并未注入腳本或者執行代理,則可能導致請求無法發送、發送缺少 body 等問題,常見于一些集成的二方庫、三方庫中的 WKWebView 實例。

(2)問題二:重寫腳本完備性很難保障由于需要在 JS 層重寫請求發送邏輯,比如 form 表單提交、AJAX、Fetch 等接口,重寫接口的質量直接決定方案的完備度。且 WKWebView 原設計有不少能力在 c++ 層面實現,僅在 JS 重寫無法保證對齊。目前已知的問題有:

對于同步請求,此方案目前無法支持。
對于流式請求,比如上傳場景,目前支持度較差。只能在 JS 側全量讀取之后再進行發送。
無法處理 Fetch API Stream 返回值。
當使用 Form 表單提交內容包含大塊數據時,可能出現丟失、Crash 等情況。

代理方案 2

此方案是基于蘋果在 iOS 11 上開放的 [WKWebViewConfiguration setURLSchemeHandler:forURLScheme:] 接口做"擴展"來實現。對于 iOS 11.3 以后的設備,此方案具備較好實用性(WebKit 處理了部分 Body 傳遞問題)。

1)方案思路

[WKWebViewConfiguration setURLSchemeHandler:forURLScheme:] 可以在 WKWebView 實例上注冊自定義請求 Scheme。如果 WKWebView 發送的請求匹配注冊 Scheme,則會代理到 UI 進程(App 進程) 執行發送動作。
WKWebView 內部默認不支持注冊 http(s) 等標準 Scheme,但是有"黑魔法"可繞過限制。
對于 AJAX 發送 BLOB 數據時,也會出現 body 丟失的情況,可以參考 代理方案1 中類似的方案來解決。
2)方案優勢

代理方案 2 相對方案 1 兩個巨大的優勢在于:

不用一刀切,配置與 WKWebView 實例綁定:即可以定向處理我們需要處理的 WKWebView 實例,對于 三方庫 中的對象,完全可以做到無影響,安全性大大提高。
不用重寫所有發送請求:大部分情況下請求中的 body 是可以被攜帶到 App 進程,即我們只需定向處理部分異常即可,健壯性大大提升。
3)方案弊端

此方案除去有 iOS 11.3 的系統版本限制外,在具體運行中也有也有不少很難處理的問題,主要如下:

(1)問題一:多圖分片下載情況下,WKWebView 內部存在處理時序存在 BUG

問題表現:在 WKWebView 中加載大圖、且大圖數據存在存在分片返回時,WKWebView 內部時序處理異常可能導致 圖片無法展示、圖片展示不完整等問題。具體可結合 WebKit 中對圖片加載的流程來簡單說明下:

問題即出現在上述 step1, step2, step3 的執行順序上。在異常情況下,會偶現執行順序為:step1 -> step3 -> step2, 且 step3 不再被觸發(allDataReceived),進而導致圖片最終的內容未渲染上屏。

解決方案:目前暫無有效的解決辦法,通過配置 suppressesIncrementalRendering 配置為 YES 某種程度上可以緩解問題,但并無法根治且對體驗略有影響。

(2)問題二:iOS 12及以下系統系統同步 AJAX 導致 Crash

問題表現:在 WKWebView 中如果出現 Web 頁面發送 sync request,則可導致 WebContent 進程崩潰,WKWebView 回調 webViewWebContentProcessDidTerminate,進而導致頁面白屏等問題。此問題可明確是 WebKit 內部的 BUG,且已有相關 Fix:

Bug1: WebURLSchemeHandlerProxy::loadSynchronously crash with sync request(2018-08-06 14:14 ):https://bugs.webkit.org/show_bug.cgi?id=188358

 

Bug2: WKURLSchemeHandler crashes when sent errors with sync XHR(2019-06-20 01:20):https://bugs.webkit.org/show_bug.cgi?id=199063

處理方案:對于 Bug1,處理相對比較簡答,即在網絡請求回調 error 之前優先回調部分空數據,規避掉問題;但是對于 Bug2,目前缺少有效的解決辦法。

(3)問題三:301 請求下 SWAP 導致頁面無法轉場問題

問題表現:如果頁面中存在使用 301 做重定向的情況,可能會出現重定向頁面無法加載的情況,進而導致頁面異常、白屏等問題。

處理方案:關閉 processSwapsOnNavigation,將置為 NO(內部屬性)。

總的來說,雖然代理方案 2 相比代理方案 1 有很大的優勢,但此方案因為版本限制等原因,目前使用量相比代理方案 1 略低。且與代理方案 1 相比,此方案的優勢和劣勢都很明顯,如多圖分片場景下可能導致圖片無法展示的問題,目前未找到有效的解決辦法。方案 2 是否可替代方案 1 在生產環境使用,還需使用同學自己斟酌。

2 Cookie 問題

根據官方文檔及資料,我們可知 WKWebView 因為其"獨立存儲",導致 Cookie 和 Cache 與 App 不互通,進而有問題。但是這種表述較為模糊,且實際使用中 WKWebView 與 App 的 Cookie 并非完全隔離,這種模棱兩可的表現很難讓人搞清楚"通"或"不通"的邊界在哪里。

下面首先根據自己對這塊的理解,嘗試說明下 WKWebView 使用 Cookie 問題到底是什么、以及背后的原因。由于蘋果并未對全部代碼開源,下有不少內容是自己的理解和推斷,無法保證完全正確,僅介紹部分思路和判斷,供大家在需要時參考。

Cookie 管理策略

根據上節的背景介紹我們可知,iOS Cookie 相關內容,是在 CFNetwork 這一層由 CFHTTPCookie、CFHTTPCookieStorage 等來管理,是 CFNetwork 模塊的一部分。且對于 Session Cookie 和 持久化 Cookie,系統有著不同的管理策略:

Session Cookie:內存中保存,進程周期內生效。在 iOS 移動端,一個 App 進程 即對應于一個 Session,即 Session Cookie 可在進程內共享。
持久化 Cookie:這部分 Cookie 除保存內存以外,還會持久化到磁盤,可多次使用。本地文件存儲在 沙箱文件夾/Library/Cookies/Cookies.binarycookies;需要特別注意的是:持久化 Cookie 并非在產生之后立即同步到 Cookies.binarycookies,根據經驗會有一個 300ms ~ 3s 的延遲。

WKWebView Cookie 問題

基于上節的 iOS Cookie 管理、結合多進程模型,我們大概可以推斷 App 與 WKWebView Cookie 管理模型,見如下簡圖:

注意:WKHTTPCookieStore 為示意,畫到了 Networking 進程,實際情況中此模塊分散在 WebContent、Networking 以及 UI Process 中,且各進程中的部分通過 IPC 橋接。

根據上圖可以引導出 WKWebView Cookie 相關的 2 個核心點:

1)WKWebView Cookie 問題具體是什么

對于 "Session Cookie":App 進程與 WKWebView 進程(WebContent + Networking)之間 完全隔離。
對于 "持久化 Cookie":App 進程與 WKWebView 進程(WebContent + Networking)之間 同步存在時差。
2)造成 WKWebView Cookie 問題的根本原因

App 進程 與 Networking 雙進程的設計。

核心目標

在了解 WKWebView 問題以及對應的根本原因之后,如何來處理此問題相對也清晰了:根據是否采用代理了 WKWebView 的網絡請求,我們需要不同的處理策略。

場景 1 - 未代理 WKWebView 網絡請求:Cookie 完全由 Networking 進程管理,WKWebView 內可自閉環。大部分情況下 App 進程也無需感知,如果確實需要感知,可以根據業務場景選擇 JS 橋接、強制持久化等方案。
場景 2 - 已代理 WKWebView 網絡請求:Cookie 大部分是由 App 進程來管理,此時應該采用何種同步策略。
由于場景 1 中我們并未在生產環境中采用,故本文不打算做冒然分析。下面主要聚焦于場景 2 來做進一部分分析。在場景 2 下我們的核心目標:

對于 App 進程中產生的 Cookie,能夠及時同步到 Networking 進程:主要解決 Reponse 中存在 "Set-Cookie" 情況下,JS 端如何及時讀取相關 Cookie 的問題。
對于 WebContent 中由 JS 產生的 Cookie,能及時同步到 App 進程:主要解決在 JS 端產生 Cookie 之后,我們如何保證在后續代理的網絡請求中可被正常攜帶的問題。

同步手段

在確認方案之前,我們首先要搞清楚一個問題:客戶端側 Cookie 來源有哪些?

對于 App 進程,Cookie 來源有兩個:

通過 NSHTTPCookieStorage 寫入的。
在網絡請求 Response Header 中通過 "Set-Cookie" 寫入的。
對于 WebContent 進程,主要是 JS 通過 document.cookie 寫入的(網絡代理之后 Set-Cookie 不會在 WKWebView 進程中生效)。

其次,我們要確認可用做同步的手段有哪些:

對于 iOS 11 之后的系統,蘋果已經為我們提供了 WKHTTPCookieStore 對象用來讀寫、監聽 WKWebView 對應的 Cookie,可以直接使用。

對于 iOS 11 之前的系統,需要區分處理一下。

從 App 進程同步到 Networking 進程,簡單流程如下:

第1步,需要把 Session Cookie 持久化,臨時保存(注意需要標識,以供恢復)。
第2步,調用 NSHTTPCookieStorage 內部接口 _saveCookies 觸發強制同步。
第3步,恢復臨時保存的 Session Cookie,避免污染。
由于 Networking 進程不會產生 Cookie,所以我們下面要做的是從 WebContent 進程同步 Cookie:處理策略即在 JS 側重寫 document.cookie 方法,在 JS 修改 cookies 時,通過 bridge 將 cookie 傳遞到 App 進程。

處理方案

在理清楚問題、目標和可用手段之后,我們即可總結出 WKWebView Cookie 相關問題的處理方案:

對于 iOS 11 及之后的系統,我們可以通過 HOOK NSHTTPCookieStorage 中讀寫 Cookie 的接口,并且監聽網絡請求中 "Set-Cookie" 關鍵字,在 App 進程 Cookie 發生變化時同步到 WKWebView;同時通過 WKHTTPCookieStore 提供 cookiesDidChangeInCookieStore 能力來監聽 WKWebView 中 Cookie 的變化。
對于 iOS 11 之前的系統,處理策略類似。但是我們需要過 NSHTTPCookieStorage 接口來做強制同步,并且需要注意恢復 Cookie 的 SessionOnly 屬性;同時需要通過在 JS 側重寫 document.cookie 的方式,來感知 WKWebView 中 Cookie 的變化。
特別注意:

采用 iOS 11 之后方案處理時一定要注意,對 WKHTTPCookieStore 的操作會 涉及到 IPC 通信,如果通信過于頻繁、通信數據量過大,會產生明顯的性能問題。極端情況可能造成 IPC 模塊異常,出現所有 WKWebView 都無法加載的情況。比如典型的場景,如果一個頁面請求較多、每個請求都帶"Set-Cookie"、且業務上為了簡單,每次把 App 進程的 Cookie 全量同步到 WKWebView,則 Cookie 過多時,有一定概率(暴力測試可復現)觸發 IPC 異常,導致后續所有 WKWebView 實例都無法正常加載,只有 App 殺進程才可恢復。建議在同步 Cookie 時,盡量按需同步變化的部分。

3 全面屏適配問題

全面屏適配問題相對不復雜,但因為 WKWebView 如 UIWebView 在表現上的不同,導致容易造成一些困擾。

問題是 UIWebView 與 WKWebView 在對前端 viewport-fit 支持表現上略有差別:UIWebView 對 viewport-fit 支持度較好,表現基本與官方文檔表述一致。但是 WKWebView 中存在一個潛規則,如果 Web 頁面內 body 的高度,在沒有超出 WKWebView 組件實際高度時,viewport-fit=cover 可能不生效。

處理辦法是在頁面中規避掉此類情況,如配置 body height 為 100vh (或其它類似方案)。

4 WebContent 進程崩潰問題

這是一個出現概率不高,但是缺乏通用、有效解決辦法的問題。我們知道 WKWebView 多進程模式下,如果 WebContent 進程因為各種原因出現 Crash,則 WKWebView 會通過 webViewWebContentProcessDidTerminate 回調告訴開發者,一般情況下我們會通過 reload 方法重新加載頁面。同時如果用戶設備內存緊張,則可能出現系統主動 KILL WebContent 進程的情況。即可能出現 App 進程(前臺)正常,但是 WebContent 崩潰、頁面重新加載的情況。

絕大部分情況,進入此流程并不一定會對用戶操作造成困擾。但是,如果此時造成內存緊張是因為前端觸發業務導致,典型如表單中喚起相機上傳圖片,此流程對用戶的影響可能是致命的。即使我們通過 WebView reload 使頁面恢復,用戶在執行的上傳動作也會被打斷,導致提交流程出現異常、影響用戶的操作。且如果用戶設備進入此狀態,大部分情況下用戶再次操作還會觸發同樣的流程。

這種情況下,用戶無法及時感知到造成問題的根本原因,絕大多數直觀反應即為:“App 出現 bug 了!”故從用戶角度來看,缺少自動恢復、處理問題的辦法。

目前此問題缺乏有效、統一解決辦法,一種解決思路是客戶端與前端配置,針對核心、可能出現異常的流程,定向設計解決方案。通過端側的能力來將數據持久化,在類似異常發生之后使用持久化數據恢復現場,盡量在用戶無感的情況下保證用戶操作流程正常。

四 總結

以上便是我們在端容器設計開發過程中,WKWebView 使用上遇到的一些典型問題和對應的解決辦法。總的來說,目前造成這么不協調的狀態,大部分是因為系統平臺未能充分考慮開發者訴求、組件設計對歷史業務兼容性不佳導致的。當然,現在這種狀態必然也不是一種合理狀態,未來無論是系統平臺方、還是業務方、或者是開發者,當矛盾無法協調時總有一方要進行妥協。在這個時間點來臨之前,希望上面總結內容,能夠為受此類問題困擾的同學提供一些幫助。

 

責任編輯:梁菲 來源: 阿里云云棲號
相關推薦

2015-09-14 09:16:17

iOS統計打點

2019-12-10 08:00:46

Kata容器Linux

2022-10-26 09:57:52

VectorRustC++

2020-08-11 08:59:20

容器虛擬化技術

2017-01-10 13:33:51

iOS編程throttle

2017-05-15 21:50:54

Linux引號

2024-02-04 17:03:30

2012-05-01 08:06:49

手機

2011-05-19 16:47:50

軟件測試

2017-04-06 09:35:10

大數據SparkSQLSpark

2010-07-26 11:02:19

Perl模式匹配

2020-07-29 08:14:59

云計算云遷移IT

2012-01-02 19:30:22

iPad

2009-07-29 10:36:04

北電收購

2011-07-04 15:30:24

Qt 布局 GridLayout

2011-06-30 14:34:17

QT Tablewidge QTableWidg

2011-09-19 15:40:35

2011-12-02 10:32:23

Java

2021-10-19 21:39:51

Unsafe構造器內存

2011-08-22 16:42:43

SqliteiPad
點贊
收藏

51CTO技術棧公眾號

亚洲国产另类 国产精品国产免费| 国产欧美精品一区aⅴ影院 | 九色91在线视频| 老熟妇一区二区三区| 国产高清久久| 国产视频在线观看一区二区| 97超碰人人爽| 蜜桃视频在线网站| 国产精品每日更新| 狠狠色噜噜狠狠狠狠色吗综合| 99re热视频| 黄色亚洲大片免费在线观看| 正在播放欧美一区| 美女黄色一级视频| 9.1麻豆精品| 狠狠综合久久av一区二区小说| 一区二区三区免费看| 亚洲aⅴ在线观看| 韩国精品在线观看| 欧美一级片在线播放| 日本一级二级视频| 欧美一区二区三| 日韩精品免费看| 岛国大片在线免费观看| 成人亚洲综合| 色综合天天天天做夜夜夜夜做| 免费人成在线观看视频播放| 番号在线播放| 91热门视频在线观看| 3d蒂法精品啪啪一区二区免费| 夜夜躁日日躁狠狠久久av| 亚洲精品乱码| 欧美日韩电影在线观看| 顶级黑人搡bbw搡bbbb搡| 亚洲三级性片| 日韩电影免费观看在线观看| 99久久久无码国产精品性波多 | www在线视频| 国产免费观看久久| 欧美凹凸一区二区三区视频| 日批视频在线播放| 成人小视频免费在线观看| 国产日本欧美一区| 在线观看国产成人| 开心九九激情九九欧美日韩精美视频电影| 欧美在线性爱视频| 五月婷婷亚洲综合| 亚洲免费精品| 97精品视频在线| 日韩av男人天堂| 韩日成人av| 久久99青青精品免费观看| 秋霞欧美一区二区三区视频免费| 欧美天天综合| 色琪琪综合男人的天堂aⅴ视频| 人妻无码一区二区三区免费| 成人羞羞视频在线看网址| 伊人久久久久久久久久久久久| 国产美女免费无遮挡| 国产欧美日韩在线观看视频| 国产亚洲精品久久久优势| 精品无码一区二区三区| 精品国产一区二区三区四区| 一区二区三区国产在线观看| 国产黄色录像片| 91精品国产成人观看| 久久久精品网站| 国产真实的和子乱拍在线观看| 亚洲国产婷婷| 日韩av不卡在线| 在线观看免费视频一区| 国精产品一区一区三区mba桃花| 91丝袜美腿美女视频网站| 精品毛片一区二区三区| 成人av第一页| 午夜精品视频在线观看一区二区| 91高清在线视频| 亚洲欧美激情插| 成年人网站国产| 精品91久久| 欧美美女网站色| 国产a√精品区二区三区四区| 日韩电影不卡一区| 伊人精品在线观看| 欧美另类视频在线观看| 国产精品最新自拍| 国产精品中文字幕在线观看| 亚洲国产精品二区| 2014亚洲片线观看视频免费| 一区二区三区不卡在线| 成全电影大全在线观看| 欧美中文字幕一二三区视频| 古装做爰无遮挡三级聊斋艳谭| 婷婷成人在线| 日韩资源在线观看| 精品肉丝脚一区二区三区| 米奇777在线欧美播放| 成人免费看片视频| 日韩精品123| 一个色综合av| 鲁一鲁一鲁一鲁一av| 国产精品99久久免费观看| 中文字幕日韩精品有码视频| 国产精品99精品| 精品在线播放午夜| 久久精品第九区免费观看 | 欧美激情在线一区二区| 国产一级不卡视频| 国产麻豆久久| 亚洲国产精品成人精品| 天天色影综合网| 99亚洲一区二区| 成人黄色av免费在线观看| 天天爽夜夜爽夜夜爽| 亚洲欧美二区三区| 色综合天天色综合| 西野翔中文久久精品国产| 九九九热精品免费视频观看网站| 老熟妇一区二区三区| 9人人澡人人爽人人精品| 少妇熟女一区二区| 国产一区二区精品调教| 日韩电影大片中文字幕 | 色婷婷激情一区二区三区| 日本成人在线免费| 小小影院久久| 欧美挤奶吃奶水xxxxx| 欧美一二三四区在线| 永久免费毛片在线观看| 亚洲欧美日本视频在线观看| 成人av播放| 免费超碰在线| 欧洲国产伦久久久久久久| 国产熟女高潮一区二区三区| 国产精品theporn| 91精品黄色| 97电影在线观看| 在线精品视频免费播放| 久久精品一区二区免费播放| 99国产精品视频免费观看一公开| 亚洲自拍偷拍色图| а√中文在线8| 欧美一区二区视频网站| 精品少妇一区二区三区密爱| 日韩国产高清影视| 久久综合入口| 欧美aa在线| 精品无人区乱码1区2区3区在线| 日韩福利片在线观看| 成人av先锋影音| 免费av手机在线观看| 精品深夜福利视频| 97视频人免费观看| 四虎精品成人免费网站| 色综合久久久久综合99| 无码 人妻 在线 视频| 久久亚洲不卡| 亚洲国产欧洲综合997久久| 成人精品国产亚洲| 色偷偷噜噜噜亚洲男人的天堂| 中文字幕日产av| 亚洲视频 欧洲视频| 精产国品一区二区三区| 在线观看视频免费一区二区三区| 国产伦精品一区二区三区免费视频| 91福利在线免费| 亚洲开心激情网| 亚洲第一区av| ●精品国产综合乱码久久久久| xxxx国产视频| 国产日韩欧美三区| 日韩欧美精品在线不卡| 四虎成人精品一区二区免费网站| 欧美日韩国产成人在线| 亚洲 美腿 欧美 偷拍| 欧美性生活一区| 久热这里有精品| 99热精品国产| 日本特黄a级片| 欧美在线二区| 久久精品人成| 欧美天堂一区二区| 欧美精品www在线观看| 台湾av在线二三区观看| 精品视频一区三区九区| 老妇女50岁三级| 久久先锋影音av| 五月天中文字幕在线| 激情久久婷婷| 色播五月综合| 盗摄牛牛av影视一区二区| 国产成人一区二区三区电影| 中文字幕在线播放网址| 亚洲男人天天操| www.97超碰| 在线观看av一区| 九九久久免费视频| 国产欧美综合在线观看第十页| 亚洲综合伊人久久| 老牛影视一区二区三区| 神马午夜伦理影院| 国产成人高清| 国产精品综合久久久久久| 国产精品诱惑| 91高清视频免费| 18+激情视频在线| 亚洲最新在线视频| 二区三区在线视频| 欧美三级韩国三级日本一级| 亚洲精品在线观看av| 国产精品黄色在线观看| 亚洲精品女人久久久| 国产精品一区在线| 亚洲天堂av线| 六月婷婷一区| 日本丰满少妇xxxx| 婷婷另类小说| 一本一生久久a久久精品综合蜜| 日韩一级电影| 国产精华一区二区三区| 亚洲我射av| 国产欧美一区二区三区在线| 欧美人体一区二区三区| 欧美激情一区二区三区成人| 国产黄a三级三级三级av在线看| 亚洲乱码av中文一区二区| 欧美一级淫片aaaaaa| 日韩一级二级三级精品视频| 97免费观看视频| 精品视频一区二区三区免费| 国产91国语对白在线| 亚洲成人激情自拍| 国产精品99精品| 亚洲国产另类精品专区| 久久免费黄色网址| 亚洲一区二区三区四区在线| 妺妺窝人体色www婷婷| 亚洲欧洲综合另类在线 | 亚洲欧美日韩中文播放| 妖精视频在线观看免费| 国产欧美日韩久久| 国产精品密蕾丝袜| 国产视频一区二区在线| 成年人在线免费看片| 国产偷v国产偷v亚洲高清| av在线网站观看| 久久久久久免费网| 亚洲色成人网站www永久四虎| 久久久久亚洲综合| 欧美偷拍一区二区三区| 国产欧美精品一区二区三区四区| 美国美女黄色片| 中文字幕成人网| 欧美xxxooo| 亚洲免费看黄网站| 免费人成视频在线| 亚洲国产精品麻豆| 国产乡下妇女做爰视频| 欧美日韩免费区域视频在线观看| 亚洲婷婷综合网| 色哟哟日韩精品| 一级特黄aa大片| 日韩欧美一区电影| 人妻视频一区二区三区| 日韩成人在线免费观看| 久蕉依人在线视频| 视频直播国产精品| caoporn免费在线视频| 久久久久久久av| 在线成人av观看| 91精品国产自产在线观看永久| 精品一区二区三区视频在线播放| 成人三级在线| 自拍自偷一区二区三区| 精品美女国产在线| 日韩影院一区二区| 亚洲国产欧美一区二区三区丁香婷| 黄色小说综合网站| 日本在线视频播放| av在线免费不卡| 精品视频高清无人区区二区三区| 国产伦一区二区| 日韩精品一区二区三区在线 | 相泽南亚洲一区二区在线播放 | 久久精品一区二区三区不卡牛牛| 手机毛片在线观看| 亚洲精品乱码久久久久久日本蜜臀| 日韩免费一级片| 精品视频一区 二区 三区| 亚洲av无码片一区二区三区| 亚洲女人天堂网| 国产福利视频在线| 欧美亚洲激情在线| 高清一区二区| 日本免费高清一区| 国产一区二区三区四区老人| 成人在线观看黄| 国产91对白在线观看九色| 精品无码一区二区三区| 一区二区三区四区精品在线视频| 久久久成人免费视频| 欧美一激情一区二区三区| 久久久资源网| 欧美激情2020午夜免费观看| 午夜日韩成人影院| 岛国一区二区三区高清视频| 色狮一区二区三区四区视频| 久久视频这里有精品| 极品少妇一区二区| 老熟妇一区二区| 亚洲福利一区二区| 国产乱淫a∨片免费视频| 亚洲色图35p| 久草在线中文最新视频| 91久久国产婷婷一区二区| 视频精品在线观看| 日本精品免费观看| 九九视频免费看| 一区二区三区在线高清| 国模私拍一区二区| 日韩精品免费视频| 美女航空一级毛片在线播放| 91精品免费看| 成人直播大秀| 黄色高清无遮挡| 97久久精品人人做人人爽50路 | 亚洲欧洲中文字幕| 九九热免费精品视频| 91蜜桃传媒精品久久久一区二区| 久久精品国产亚洲AV无码男同| 欧美一二三区在线观看| 米奇777四色精品人人爽| 国产精品自在线| 日韩成人激情| 成人性做爰aaa片免费看不忠| 久久蜜桃av一区二区天堂| 成年免费在线观看| 亚洲精品www久久久久久广东| 美女精品导航| 国产综合 伊人色| 亚洲三级观看| 丰满少妇一区二区三区| 欧美日韩一二三四五区| 日本一区高清| 国产成人精品免高潮费视频| 精品美女视频| 2025韩国理伦片在线观看| 国产精品久久久久9999吃药| 在线免费观看一区二区| 色婷婷成人综合| 国产精品亚洲欧美日韩一区在线| 在线丝袜欧美日韩制服| 久久成人久久爱| 91高清免费观看| 日韩精品资源二区在线| xxx.xxx欧美| 久久久久久久久久久一区 | 五月激情综合| 国产成人av免费观看| 亚洲午夜三级在线| 五月天激情开心网| 青青a在线精品免费观看| 欧美日中文字幕| 国产精品久久久久久9999| 一区二区三区四区蜜桃| 亚洲区小说区图片区| 国产激情视频一区| 国产精品久久久乱弄 | 国产精品115| 精品国产成人av在线免| 中文一区二区完整视频在线观看| 一级成人免费视频| 欧美床上激情在线观看| 精品亚洲自拍| 中文字幕第80页| 白嫩亚洲一区二区三区| 97精品在线视频| 精品视频网站| 超级砰砰砰97免费观看最新一期 | 国产精品视频一二三| 国产喷水福利在线视频| 国内外成人免费激情在线视频网站| 美女久久99| 天美一区二区三区| 欧美性猛xxx| 老司机精品视频在线观看6| 国产成人av一区二区三区| 久久久人人人| 日韩欧美综合视频| 日韩精品极品视频| 99精品国产九九国产精品| 国产午夜福利100集发布| 国产精品蜜臀av| 亚州视频一区二区三区| 成人在线激情视频| 久久精品导航| 国产主播在线观看| 中文字幕欧美日韩| 极品尤物一区| 亚洲一级片免费观看|