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

攜程機(jī)票iOS Widget實(shí)踐

移動(dòng)開(kāi)發(fā) 移動(dòng)應(yīng)用
近期接到一項(xiàng)產(chǎn)品需求,需要實(shí)現(xiàn)若干機(jī)票業(yè)務(wù)相關(guān)的Widget,此文總結(jié)該需求開(kāi)發(fā)上線(xiàn)過(guò)程中的踩坑填坑經(jīng)驗(yàn)。

作者 | Derek Yang,攜程資深研發(fā)經(jīng)理,專(zhuān)注于iOS開(kāi)發(fā)&跨端技術(shù)研究,熱衷于新技術(shù)探索。

一、前言

2020年9月蘋(píng)果發(fā)布了iOS 14.0,相較之前有了很大的功能改觀(guān),很重要的一點(diǎn)是用戶(hù)可以更加個(gè)性化的定義自己的桌面,Widget就是這項(xiàng)功能的主角。

近期接到一項(xiàng)產(chǎn)品需求,需要實(shí)現(xiàn)若干機(jī)票業(yè)務(wù)相關(guān)的Widget,此文總結(jié)該需求開(kāi)發(fā)上線(xiàn)過(guò)程中的踩坑填坑經(jīng)驗(yàn)。

Widget俗稱(chēng)小組件,是蘋(píng)果推出的眾多App Extension中的一款。因此在介紹Widget之前,需要先了解App Extension及其工作原理。

二、App Extension簡(jiǎn)介

iOS 8.0開(kāi)始,就支持了App Extension的開(kāi)發(fā)來(lái)滿(mǎn)足豐富App的需要。

2.1 什么是App Extension?

App Extension顧名思義是應(yīng)用擴(kuò)展。所以它不是一個(gè)應(yīng)用程序,而是實(shí)現(xiàn)一個(gè)特定的、范圍明確的自定義任務(wù)。

這個(gè)任務(wù)由開(kāi)發(fā)人員自定義,并遵循系統(tǒng)規(guī)范的擴(kuò)展策略,在用戶(hù)與其他應(yīng)用或者系統(tǒng)交互時(shí)將其提供給用戶(hù)。

App Extension編譯后是一個(gè)后綴名為.appex的二進(jìn)制文件,無(wú)法獨(dú)立分發(fā)和安裝,必須依附于App。

一個(gè) App 可以?huà)燧d多個(gè)種類(lèi)的App Extension。截止目前為止,蘋(píng)果已經(jīng)陸續(xù)推出33款A(yù)pp Extension,常見(jiàn)的有照片編輯(Photo Editing)、共享(Share)、自定義鍵盤(pán)(Custom Keyboard),小組件(Widget)。如下圖:

2.2 App Extension工作原理

App Extension的生命周期與常規(guī)App不同,需要一個(gè)包含Extension的App(Containing App),以及喚起Extension的App(Host App)。

當(dāng)用戶(hù)通過(guò)Host App喚起Extension時(shí),系統(tǒng)實(shí)例化Extension,從此Extension的生命周期開(kāi)始,Extension開(kāi)始執(zhí)行自己的任務(wù)。之后當(dāng)任務(wù)執(zhí)行結(jié)束或者用戶(hù)通過(guò)Host app結(jié)束任務(wù)時(shí),或者系統(tǒng)由于某種原因?qū)⑵溥M(jìn)程結(jié)束,Extension的生命周期到此結(jié)束。

官方簡(jiǎn)介圖:

Extension、Containing App和Host App三者之間的通信關(guān)系,如下官網(wǎng)圖示:

由圖可知App Extension與Host App可以直接通信,而App Extension和Containing App之間并不直接通信。

這樣設(shè)計(jì)可以保證App Extension在運(yùn)行時(shí)與Containing App隔離,不依賴(lài)于App,甚至在Extension在運(yùn)行時(shí),Containing App都不會(huì)主動(dòng)運(yùn)行,Containing App和Host App兩者間沒(méi)有通信。

但是在實(shí)際應(yīng)用場(chǎng)景中,仍然會(huì)有和Containing App通信的需求,這里系統(tǒng)給出的方案是在兩者之間使用共有存儲(chǔ)來(lái)解決數(shù)據(jù)通信的問(wèn)題,App Extension需要打開(kāi)Containing App 并附帶一些參數(shù),則可以通過(guò)Open Url的方式來(lái)實(shí)現(xiàn)。

如下官方圖示說(shuō)明:

詳細(xì)的數(shù)據(jù)共享方式將在后續(xù)Widget的篇幅中詳細(xì)介紹。初步了解App Extension后,接下來(lái)詳細(xì)分析Widget。

三、Widget簡(jiǎn)介

Widget是能添加到用戶(hù)桌面或者在“今日視圖"中獨(dú)立運(yùn)行的程序。

Widget前身是Today Extension,其在iOS 8.0第一次推出,在iOS 14.0被廢棄,Widget于iOS 14.0推出。實(shí)際兩者有較大的區(qū)別:

外觀(guān)上Today Extension只能添加到負(fù)一屏,只有展開(kāi)和收起兩種尺寸,開(kāi)發(fā)人員可以自定義這部分區(qū)域的布局大小。Widget不僅可以添加到負(fù)一屏,還可以添加到桌面,和App并列,同時(shí)支持三種樣式(小:2x2、中:4x2、大:4x4),這三種樣式不支持自定義尺寸。

Widget開(kāi)發(fā)使用蘋(píng)果新推出的WidgetKit,UI開(kāi)發(fā)只能使用SwiftUI,而Today Extension則使用UIKit。因此進(jìn)行Widget開(kāi)發(fā),需要Swift和SwiftUI的技術(shù)知識(shí)。

Xcode12不再提供Today Extension的添加,對(duì)于已有Today Extension的App,系統(tǒng)仍然在負(fù)一屏保留的區(qū)域展示,并且不能像Widget一樣隨意拖動(dòng)移動(dòng)位置和刪除等操作,僅保留最初的規(guī)則

小中大三種樣式的展示效果:

圓角為系統(tǒng)自帶

三種尺寸在不同設(shè)備上的實(shí)際渲染尺寸,如下官網(wǎng)數(shù)據(jù)截圖:

iPhone

iPad

機(jī)票當(dāng)前需求僅需支持小卡、中卡兩種樣式。

四、Widget的開(kāi)發(fā)框架簡(jiǎn)介

4.1 單/多個(gè)widget配置

單個(gè)和多個(gè)Widget在實(shí)際代碼中的入口不同。

單個(gè) widget 需要實(shí)現(xiàn) Widget protocol

@main
struct Widget1: Widget {
let kind: String = "widgetTag"
var body: some WidgetConfiguration {
...
}
}

多個(gè) Widget 需要實(shí)現(xiàn) WidgetBundle protocol

@main
struct TripWidgets: WidgetBundle {
@WidgetBundleBuilder
var body: some Widget {
Widget1()
Widget2()
Widget3()
...
}
}

Widget的添加操作需要用戶(hù)在系統(tǒng)添加小組件頁(yè)面進(jìn)行,該頁(yè)面會(huì)展示一些簡(jiǎn)單信息供用戶(hù)查看。

展示信息的具體配置如下:

struct Widget1: Widget {
let kind: String = "widgetTag"
var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: Provider()) { entry in
Widget1View(entry: entry)
}
.configurationDisplayName("旅行靈感")
.description("下段旅程,即刻啟程")
.supportedFamilies([WidgetFamily.systemSmall,WidgetFamily.systemMedium])
}
}

4.2 Widget整體結(jié)構(gòu)

1)每個(gè)Widget都需要返回一個(gè)WidgetConfiguration,分為兩種:

  • 可編輯的小組件 IntentConfiguration
  • 不可編輯 StaticConfiguration2) 每個(gè)WidgetConfiguration都需要一個(gè)Provider和一個(gè)ViewContent。

Provider用于做數(shù)據(jù)層刷新,主要有三個(gè)function:

  • placeholder (用于返回默認(rèn)展示的數(shù)據(jù)Model)
  • getSnapshot(用于渲染呼出添加小組件時(shí)的UI展示)
  • getTimeline(用于添加到用戶(hù)桌面后的數(shù)據(jù)和UI刷新)

ViewContent用于UI展示,分三種大小:2x2(Small)、4x2(Medium)、4x4(Large)

API整體架構(gòu)串聯(lián)圖:

4.3 Widget刷新策略

由于Widget是用戶(hù)添加到用戶(hù)桌面的,刷新也需要系統(tǒng)管理,系統(tǒng)為此定義了一個(gè)刷新規(guī)則。通過(guò)Provider的getTimeline來(lái)實(shí)現(xiàn),基本原理是給系統(tǒng)提交一組未來(lái)時(shí)間內(nèi)用于刷新UI的數(shù)據(jù),每個(gè)數(shù)據(jù)與時(shí)間綁定,然后系統(tǒng)根據(jù)時(shí)間點(diǎn),將預(yù)設(shè)的數(shù)據(jù)渲染給到用戶(hù)。

Provider定義如下:

public protocol TimelineProvider {
associatedtype Entry : TimelineEntry
typealias Context = TimelineProviderContext
func placeholder(in context: Self.Context) -> Self.Entry
func getSnapshot(in context: Self.Context, completion: @escaping (Self.Entry) -> Void)
func getTimeline(in context: Self.Context, completion: @escaping (Timeline<Self.Entry>) -> Void)
}

Timeline結(jié)構(gòu)如下:

public struct Timeline<EntryType> where EntryType : TimelineEntry {

public let entries: [EntryType]

public let policy: TimelineReloadPolicy

public init(entries: [EntryType], policy: TimelineReloadPolicy)
}

構(gòu)建Timeline的參數(shù)

entries: [EntryType] 做數(shù)據(jù)和時(shí)間綁定,自定義的數(shù)據(jù)實(shí)體需要遵守TimelineEntry的協(xié)議。

TimelineEntry的具體實(shí)現(xiàn)均需要一個(gè)date和一個(gè)數(shù)據(jù)。

TimelineEntry定義如下:

public protocol TimelineEntry {
var date: Date { get }
var relevance: TimelineEntryRelevance? { get }
}

policy: TimelineReloadPolicy 刷新策略

TimelineReloadPolicy是負(fù)責(zé)決定下一次更新策略的配置對(duì)象。

系統(tǒng)通過(guò)Provider的getTimeline來(lái)做數(shù)據(jù)刷新操作的回調(diào),開(kāi)發(fā)者在此方法中將獲取的數(shù)據(jù)提交封裝成TimelineEntry,并加上Timeline的刷新策略提交給系統(tǒng),最終實(shí)現(xiàn)刷新。

此處刷新策略,系統(tǒng)給出了下面三種方式:

1)atEnd,按照entries中給到的所有日期和數(shù)據(jù)執(zhí)行刷新操作后,再一次調(diào)用getTimeline來(lái)更新刷新策略。

2)after,用于指定未來(lái)的一個(gè)時(shí)間,調(diào)用getTimeline就更新刷新策略。

3)never,添加之后執(zhí)行一次后,不再執(zhí)行做策略刷新。

4.4 App和Widget關(guān)聯(lián)&互操作

1)Widget和App的數(shù)據(jù)關(guān)聯(lián),遵循App Extension的規(guī)范,系統(tǒng)提供了NSUserDefaults和NSFileManger兩種方式來(lái)做數(shù)據(jù)共享。前提都需要開(kāi)啟App Groups的功能。

NSUserDefaults方式

//存
NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.xxx.xxx.xx"];
[userDefaults setObject:@"test_content" forKey:@"test"];
[userDefaults synchronize];
//取
NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.xxx.xxx.xx"];
NSString *content = [userDefaults objectForKey:@"test"];

NSFileManger

// 存
NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.xxx.xxx.xx"];
containerURL = [containerURL URLByAppendingPathComponent:@"testfile"];
[data writeToURL:containerURL atomically:YES];

//取
NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.xxx.xxx.xx"];
containerURL = [containerURL URLByAppendingPathComponent:@"testfile"];
NSData *value = [NSData dataWithContentsOfURL:containerURL];

2)App的信息改變主動(dòng)刷新Widget,系統(tǒng)提供了如下方式實(shí)現(xiàn):

WidgetCenter.shared.reloadTimelines(ofKind: "widgetTag")

3)Widget喚醒App

以Unviersal Links /URL Schema跳轉(zhuǎn),控件采用如下兩種配置即可實(shí)現(xiàn):

  • widgetURL(小卡只支持整個(gè)區(qū)域的點(diǎn)擊)
  • Link(小卡不支持,中卡和大卡可以支持局部區(qū)域的跳轉(zhuǎn))

卡片打開(kāi)會(huì)調(diào)用App的如下生命周期方法,如需跳轉(zhuǎn)到具體頁(yè)面此處做路由即可。

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
//URLContexts.first?.url.absoluteString
....
}

五、項(xiàng)目開(kāi)發(fā)經(jīng)驗(yàn)總結(jié)

總體來(lái)講按照官方開(kāi)發(fā)文檔就能快速實(shí)現(xiàn)一個(gè)Widget,但是實(shí)際開(kāi)發(fā)中總會(huì)遇到一些限制和問(wèn)題。下面是我們?cè)陧?xiàng)目開(kāi)發(fā)中遇到的一些問(wèn)題和限制的總結(jié)。

5.1 Widget的數(shù)量限制

官方文檔表明每個(gè)App最多配置5種Widget,可以是App添加多個(gè)WidgetExtension的target,也可以是一個(gè)WidgetExtension的target中添加多種Widget,每種Widget最多支持三種樣式:systemSmall,systemMedium,systemLarge,總共最多可添加15種Widget到桌面。

每種Widget可以被添加多次,這個(gè)取決于用戶(hù)的操作。(實(shí)測(cè)本地模擬器環(huán)境可超過(guò)5種,實(shí)際發(fā)布上線(xiàn)未驗(yàn)證)

5.2 不是所有的SwiftUI組件都可用

WidgetKit限制Widget UI需由SwiftUI實(shí)現(xiàn),但并不是所有SwiftUI的組件都可供Widget使用。如果遇到不支持的組件,WidgetKit渲染時(shí)會(huì)忽略。

具體可使用的組件參見(jiàn)官方文檔。

5.3 圖片加載問(wèn)題

由于系統(tǒng)提供的機(jī)制是需要提前預(yù)設(shè)數(shù)據(jù),我們最初嘗試用像App一樣的方式去加載圖片控件,結(jié)果發(fā)現(xiàn)圖片并不加載。原因是這里不能做異步,需要同步獲取Image。

另外此處圖片不易過(guò)大,也會(huì)影響加載,具體size取決于當(dāng)時(shí)系統(tǒng)的處理能力。(實(shí)測(cè)遇到200k的圖片無(wú)法加載的情況)

5.4 Widget點(diǎn)擊事件

小卡只支持widgetURL,整個(gè)卡片區(qū)域只能做一個(gè)事件響應(yīng)。中卡和大卡可支持Link,可支持多個(gè)區(qū)域的點(diǎn)擊。點(diǎn)擊未設(shè)置widgetURL和Link的區(qū)域,都會(huì)默認(rèn)喚起Containing App。

點(diǎn)擊Widget的Widget和Link方式,只能打開(kāi)主Containing App,即使URL維護(hù)的是其他App的Schema,也是無(wú)法打開(kāi)其他App的。

5.5 代碼共享注意點(diǎn)

官方介紹在共享代碼時(shí)強(qiáng)調(diào)引入的API必須是AppExtension支持的,否則在審核時(shí)會(huì)被拒。

  • SharedApplication的相關(guān)API
  • 帶有NS_EXTENSION_UNAVAILABLE標(biāo)記的(iOS 8.0中的HealthKit、EventKit UI)
  • 訪(fǎng)問(wèn)攝像頭/麥克風(fēng)(iMessage除外)
  • 執(zhí)行長(zhǎng)時(shí)間的后臺(tái)任務(wù)
  • 用AirDrop接受數(shù)據(jù)(可發(fā)送數(shù)據(jù))

具體參見(jiàn) Using an Embedded Framework to Share Code

5.6 刷新次數(shù)的限制

雖然系統(tǒng)給出了這些刷新方案,但是在實(shí)際運(yùn)行時(shí)次數(shù)上會(huì)有一定的限制和出入。

  • 策略刷新頻率至少相隔5分鐘(少于這個(gè)間隔可能會(huì)不準(zhǔn)確,刷新機(jī)制雖然提供了API支持,但是實(shí)際刷新還是由系統(tǒng)掌控,并不是你添加的每次刷新都能準(zhǔn)確的奏效)。
  • 系統(tǒng)為了減負(fù),在這個(gè)基礎(chǔ)上做了一層機(jī)器學(xué)習(xí),實(shí)際的刷新會(huì)根據(jù)用戶(hù)手機(jī)上小組件的可見(jiàn)頻率時(shí)間、上次重新加載的時(shí)間以及主app的活動(dòng)狀態(tài)做動(dòng)態(tài)分配。

5.7 系統(tǒng)主動(dòng)刷新機(jī)制

同時(shí)系統(tǒng)以下這些行為導(dǎo)致的刷新,將不會(huì)被統(tǒng)計(jì)到到刷新次數(shù)中:

  • Widget對(duì)應(yīng)的應(yīng)用程序在前臺(tái)
  • Widget對(duì)應(yīng)的應(yīng)用程序具有活動(dòng)的音頻或?qū)Ш綍?huì)話(huà)
  • 手機(jī)系統(tǒng)區(qū)域更改
  • 動(dòng)態(tài)類(lèi)型或輔助功能設(shè)置更改

5.8 Size問(wèn)題

Widget最終編譯為后綴名為.appex的二進(jìn)制文件,這一點(diǎn)同AppExtension一樣,并在ipa內(nèi)部,故size和主App共享。

5.9 熱修復(fù)問(wèn)題

暫無(wú)熱修方案,故需要做好上線(xiàn)的測(cè)試以及兜底邏輯的處理。

責(zé)任編輯:未麗燕 來(lái)源: 攜程技術(shù)
相關(guān)推薦

2023-05-12 10:14:38

APP開(kāi)發(fā)

2022-06-03 09:21:47

Svelte前端攜程

2020-12-04 14:32:33

AndroidJetpackKotlin

2017-04-11 15:11:52

ABtestABT變量法

2022-06-10 08:35:06

項(xiàng)目數(shù)據(jù)庫(kù)攜程機(jī)票

2023-11-13 11:27:58

攜程可視化

2025-06-24 09:51:47

2023-08-25 09:51:21

前端開(kāi)發(fā)

2022-08-06 08:27:41

Trace系統(tǒng)機(jī)票前臺(tái)微服務(wù)架構(gòu)

2025-06-24 09:44:41

2017-04-11 15:34:41

機(jī)票前臺(tái)埋點(diǎn)

2022-07-15 12:58:02

鴻蒙攜程華為

2017-03-15 17:38:19

互聯(lián)網(wǎng)

2022-09-09 15:49:03

攜程火車(chē)票組件化管理優(yōu)化

2022-08-12 08:34:32

攜程數(shù)據(jù)庫(kù)上云

2023-02-08 16:34:05

數(shù)據(jù)庫(kù)工具

2022-07-08 09:38:27

攜程酒店Flutter技術(shù)跨平臺(tái)整合

2022-07-15 09:20:17

性能優(yōu)化方案

2023-01-04 12:17:07

開(kāi)源攜程

2023-08-18 10:49:14

開(kāi)發(fā)攜程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

毛茸茸free性熟hd| 欧美一级爱爱视频| 亚洲图片 自拍偷拍| 一本色道久久88精品综合| 先锋影音亚洲资源| 国产高潮在线观看| 一本久道久久综合狠狠爱| 亚洲视频日韩精品| 四川一级毛毛片| 高清不卡亚洲| 一区二区三区日韩在线观看| 精品午夜一区二区| 亚洲影院一区二区三区| 国产欧美一级| 久久亚洲国产精品成人av秋霞| 一本加勒比波多野结衣| 欧美jizz18| 精品久久久中文| 中文字幕一区二区三区在线乱码| 色欲av伊人久久大香线蕉影院| 久久精品噜噜噜成人av农村| 97视频在线观看免费高清完整版在线观看| 欧美黄色一级生活片| 99re6热只有精品免费观看| 国产精品一区在线观看乱码| 亚洲精品在线看| 宇都宫紫苑在线播放| 桃子视频成人app| 亚洲成人精品一区二区| 国产精品一区在线免费观看| 久久久久无码精品国产| 国产精品男女| 欧美一二三在线| 亚洲国产高清av| 伊人久久在线| 国产v日产∨综合v精品视频| 欧美二区乱c黑人| 免费在线激情视频| 韩日视频在线| 91麻豆国产精品久久| 国产精品一区二区免费看| 国产精品热久久| 国产一级特黄a高潮片| 第一区第二区在线| 91精品国产色综合久久久蜜香臀| 青青草av网站| 日韩一级二级| 色av一区二区| 久久综合久久色| 欧美成人免费电影| 91国产福利在线| 国产免费视频传媒| 日本一区免费网站| 色94色欧美sute亚洲线路二| 99精品视频播放| 成人性生活视频| 91国偷自产一区二区使用方法| 久久9精品区-无套内射无码| 婷婷六月国产精品久久不卡| 日本乱人伦一区| 国产一级特黄a大片免费| 国产韩日精品| 欧美乱妇20p| 久久人人爽人人片| 成人搞黄视频| 亚洲精品国产精品久久清纯直播| 黄色a一级视频| 国产乱码精品一区二区三区四区| 在线成人免费网站| 婷婷国产成人精品视频| 91tv官网精品成人亚洲| 九九视频直播综合网| 国产精品白浆一区二小说| 激情欧美一区二区三区| 欧美一级片在线播放| 亚洲男人天堂网址| 激情综合色丁香一区二区| 2019国产精品视频| 五月婷婷丁香六月| 91蜜桃免费观看视频| 亚洲电影免费| 色呦呦在线看| 精品久久久久久中文字幕| 日本999视频| 天堂va在线高清一区| 亚洲精品久久久久久久久久久久久| 好吊日免费视频| 久久视频国产| 国语自产在线不卡| 尤物网站在线看| av日韩久久| 亚洲高清不卡av| 91福利免费观看| 欧洲在线一区| 欧美性做爰猛烈叫床潮| 5月婷婷6月丁香| 电影91久久久| 久久亚洲影视婷婷| 亚洲精品乱码久久久久久蜜桃91 | 欧美变态tickle挠乳网站| 久久精品综合视频| 日韩大片在线观看| 国产一区二区三区视频免费| 精品一区二区三区人妻| 久久亚洲电影| 国产精品永久免费| 日中文字幕在线| 亚洲女厕所小便bbb| av网址在线观看免费| 亚洲一二三区视频| 亚洲日本成人网| 麻豆视频在线观看| 另类的小说在线视频另类成人小视频在线 | 福利在线一区二区| 欧美精选视频一区二区| 精品欧美乱码久久久久久 | 北条麻妃在线一区| 中文一区二区三区四区| 最好看的2019年中文视频| 99热国产在线观看| 国产成人精品免费网站| 亚洲午夜激情| 伊人久久视频| 日韩精品在线免费观看视频| 激情视频在线播放| 激情亚洲综合在线| 亚洲一区二区免费视频软件合集| 午夜久久中文| 日韩av在线网| 国产无遮挡又黄又爽又色| 国产精品正在播放| 中文字幕中文字幕99| 91看片一区| 亚洲欧美日韩中文在线| 特一级黄色大片| 成人av在线资源网| 国产欧美日韩小视频| 亚洲精品一区二区三区中文字幕| 久久久精品一区二区| 91亚洲精品国偷拍自产在线观看 | 国产精品1024久久| 亚洲第一综合网站| 99精品国产九九国产精品| 在线视频欧美性高潮| 青娱乐在线免费视频| 久久久久久久久久电影| 麻豆传传媒久久久爱| blacked蜜桃精品一区| 国产99久久精品一区二区 夜夜躁日日躁 | 青草视频在线免费直播| 91精品在线一区二区| 国产精品白丝喷水在线观看| 蜜桃久久久久久| 一本一道久久久a久久久精品91| 992tv国产精品成人影院| 在线亚洲午夜片av大片| 一区二区三区日| 中文字幕日韩一区| 中文字幕一区二区三区四| 亚洲最新色图| 国产精华一区| 中文在线免费二区三区| 亚洲性无码av在线| 艳妇乳肉豪妇荡乳av| 亚洲男人的天堂在线aⅴ视频 | 91精品国产自产在线丝袜啪| 久久久久女教师免费一区| 香蕉人妻av久久久久天天| 日韩欧美国产骚| 亚洲色图27p| 国产激情一区二区三区桃花岛亚洲| 国产精品自拍合集| 亚洲第一论坛sis| 国产一区玩具在线观看| 青春草在线视频| 亚洲男人av在线| 国产精品视频一二区| 亚洲一区中文日韩| 一本色道久久综合亚洲精品图片| 蜜臂av日日欢夜夜爽一区| 最新黄色av网站| 亚洲a级精品| 国产中文欧美精品| √天堂8资源中文在线| 夜夜嗨av一区二区三区免费区| 国产伦理吴梦梦伦理| 亚洲电影在线播放| 能直接看的av| 粉嫩高潮美女一区二区三区| 国产熟人av一二三区| 91不卡在线观看| 欧美一进一出视频| 国产精品亚洲综合在线观看| 91av在线播放| 国产黄色在线免费观看| 欧美日韩在线播放一区| 免费毛片一区二区三区| 国产精品久久三| 精品一区二区视频在线观看| 久久97超碰色| 91黄色小网站| 欧美午夜电影在线观看| 亚洲蜜桃在线| 欧美变态网站| 亚洲一区二区三区sesese| bt在线麻豆视频| 亚洲最新av网址| 天堂影院在线| 欧美变态口味重另类| 91好色先生tv| 91豆麻精品91久久久久久| 日本a在线观看| 亚洲精品五月天| 午夜影院黄色片| 久久久五月婷婷| 男男做爰猛烈叫床爽爽小说| 国产剧情av麻豆香蕉精品| 免费欧美一级视频| 欧美精品国产| 亚洲小视频在线播放| 日产精品一区二区| 欧美在线一区二区三区四区| 精品日产乱码久久久久久仙踪林| 成人自拍性视频| 久久影视精品| 国产精品偷伦免费视频观看的| 欧美激情20| 97久久超碰福利国产精品…| 先锋成人av| 欧美成人精品影院| 色老头视频在线观看| 在线观看日韩av| 国产黄在线看| 亚洲欧美制服第一页| 亚洲av成人无码网天堂| 亚洲国产一区二区三区四区| 韩国av电影在线观看| 日韩西西人体444www| 国产又粗又大又爽视频| 欧美人动与zoxxxx乱| 中国黄色一级视频| 欧美在线观看禁18| 亚洲 小说区 图片区| 欧美性猛交一区二区三区精品| 午夜精品一区二| 在线观看国产精品网站| 欧美激情一区二区三区免费观看| 91国产成人在线| 在线观看亚洲国产| 欧美日韩国产首页在线观看| 91精品国产乱码久久| 欧美精品第一页| 国产福利资源在线| 精品久久人人做人人爽| 神马久久久久久久久久| 亚洲黄色成人网| 日韩美女一级视频| 亚洲人精品午夜在线观看| 成人精品一区二区三区免费| 最新69国产成人精品视频免费| 日本在线人成| 精品综合久久久久久97| 91丝袜在线| 日韩免费在线视频| 国产资源一区| 444亚洲人体| 成人午夜大片| 欧美日韩日本网| 亚洲国产精品久久久久蝴蝶传媒| 好吊色视频988gao在线观看| 99亚洲一区二区| 欧美在线观看视频网站| 国产一区二区剧情av在线| 亚洲黄色小说在线观看| 久久久久久一二三区| 国内毛片毛片毛片毛片毛片| 亚洲一区在线观看免费 | 视频一区欧美日韩| 91小视频网站| 成人小视频免费观看| 麻豆精品免费视频| 中文字幕一区二区三区不卡| 久久精品国产亚洲AV无码麻豆 | 色综合天天狠天天透天天伊人| caoporn视频在线| 国产精品高潮呻吟久久av黑人| 性欧美video另类hd尤物| 国产精品视频免费一区二区三区| 国产探花在线精品| 日韩中文字幕亚洲精品欧美| 免费在线亚洲欧美| 色婷婷一区二区三区在线观看| av中文字幕不卡| 男人在线观看视频| 欧美日韩亚洲系列| 国产免费黄色大片| 亚洲欧美999| 欧美xxxbbb| 国产日产久久高清欧美一区| 久久动漫网址| 黄色高清视频网站| 免费日韩一区二区| 成年人性生活视频| 国产精品久久久久永久免费观看 | 天天操天天干天天操天天干| 性做久久久久久免费观看欧美| 亚洲一区 中文字幕| 精品一区二区三区四区| 1stkiss在线漫画| 国产精品91久久久久久| 国产成人精品福利| www.黄色网址.com| 蜜桃视频在线观看一区二区| www.久久国产| 亚洲sss视频在线视频| 国产又粗又猛又爽又黄91| 亚洲三级av在线| а√天堂8资源中文在线| 亚洲一区二区三区四区视频| 欧美三级三级| 国产男女激情视频| 99在线精品免费| 日本亚洲欧美在线| 欧美tk丨vk视频| 在线观看三级视频| 91免费欧美精品| 日韩免费看片| 色多多视频在线播放| 久久久久久久久久久久久女国产乱| 四虎永久在线精品| 亚洲成人性视频| 黄色成人在线网| 国产成人精品福利一区二区三区| 牛牛国产精品| 超碰91在线播放| 亚洲欧美一区二区久久| 一二区在线观看| 少妇高潮久久久久久潘金莲| 国产成人精品一区二区三区视频| 日本一区二区三区视频在线播放| 香蕉成人久久| 中文字幕狠狠干| 色综合天天综合网天天看片 | 精品国产一区二区三区久久狼5月| 日本精品不卡| 日本一区二区三区四区在线观看| 久久高清免费观看| 法国空姐电影在线观看| 色婷婷香蕉在线一区二区| 美女毛片在线看| 国产精品久久91| 999国产精品视频| 亚洲五月激情网| 亚洲第一久久影院| 天天干天天草天天射| 欧美亚洲日本网站| 国产一区网站| 911福利视频| 一区二区三区在线高清| 手机看片1024国产| 欧洲日韩成人av| 日本高清免费电影一区| 欧美性猛交xxxx乱大交91| 亚洲精品大片www| 亚洲国产日韩在线观看| 国语自产精品视频在免费| 综合色就爱涩涩涩综合婷婷| 看欧美ab黄色大片视频免费 | 中文字幕黄色大片| 国产成人亚洲精品狼色在线| 国产在线一二区| 亚洲天堂男人天堂| 亚洲欧美在线综合| 人人妻人人做人人爽| 久久久一区二区| 国产精品爽爽久久久久久| 国外成人在线播放| 第一sis亚洲原创| 中文字幕在线观看视频www| 五月婷婷综合网| 在线观看av黄网站永久| 国产精品免费区二区三区观看| 欧美亚洲一区二区三区| 精品亚洲乱码一区二区| 亚洲精品一区二区精华| 性欧美gay| 国产 国语对白 露脸| 久久久一区二区三区捆绑**| 精品黑人一区二区三区国语馆| 欧美在线视频观看| 欧美wwwww| 亚洲综合自拍网| 正在播放亚洲一区| 亚洲精品国产精品国产| 法国空姐在线观看免费| 久久综合狠狠综合久久综合88| 国产精品系列视频| 欧美最猛性xxxxx(亚洲精品)| 欧美91视频| 亚洲高潮女人毛茸茸|