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

ReactNative之原生模塊開發并發布--iOS篇

移動開發
前段時間做了個ReactNative的App,發現ReactNative中不少組件并不存在,所以還是需要自己對原生模塊進行編寫讓JS調用, 正是因為在這個編寫過程中遇到不少問題,發覺了官網文檔中許多的不足。所以產生了寫一個實踐教程的想法,最終有了這么一篇文章。

[[166181]]

前段時間做了個ReactNative的App,發現ReactNative中不少組件并不存在,所以還是需要自己對原生模塊進行編寫讓JS調用, 正是因為在這個編寫過程中遇到不少問題,發覺了官網文檔中許多的不足。所以產生了寫一個實踐教程的想法,最終有了這么一篇文章。

整篇文章主要以編寫一個原生模塊為例子,來講述了我們在編寫原生模塊所用到的一些知識,并且在整個例子中,配有了完整的實踐代碼,方便大家理解并調 試。除了這些內容,文章還講述了我們如何將自己編寫的原生模塊發布到npm上分享給別人使用。希望能夠給大家帶來幫助,也希望大家將自己編寫的原生模塊分 享出來。

示例代碼github地址:https://github.com/liuchungui/react-native-BGNativeModuleExample

準備工作:

創建ReactNative工程

我們需要先創建一個ReactNative工程,使用如下命令創建。

  1. react native init TestProject 

創建好工程之后,我們使用xcode打開TestProject/ios/下的iOS工程。

創建靜態庫,并將這個靜態庫手動鏈接到工程中

首先,我們在前面創建的ReactNative工程下的node_modules創建一個文件夾react-native-BGNativeModuleExample,然后我們在新創建的文件夾下再創建一個ios文件夾。

  1. $ cd TestProject/node_modules 
  2. $ mkdir react-native-BGNativeModuleExample 
  3. $ cd react-native-BGNativeModuleExample 
  4. $ mkdir ios 

然后,由于ReactNative的組件都是一個個靜態庫,我們發布到npm給別人使用的話,也需要建立靜態庫。我們使用Xcode建立靜態庫,取 名為BGNativeModuleExample。建立之后,我們將創建的靜態庫中的文件全部copy到node_modules/react- native-BGNativeModuleExample/ios目錄下。

iOS文件目錄如下:

  1. |____BGNativeModuleExample 
  2. | |____BGNativeModuleExample.h 
  3. | |____BGNativeModuleExample.m 
  4. |____BGNativeModuleExample.xcodeproj 

最后,我們需要手動將這個靜態庫鏈接到工程中。

1、使用xcode打開創建的靜態庫,添加一行Header Search Paths,值為$(SRCROOT)/../../react-native/React,并設置為recursive。

2、將BGNativeModuleExample靜態庫工程拖動到工程中的Library中。 

3、選中 TARGETS => TestProject => Build Settings => Link Binary With Libraries,添加libBGNativeModuleExample.a這個靜態庫 

到此,我們準備工作完成了。我們這里這么準備是有用意的,那就是模擬npm鏈接的過程,建立好了環境,避免了發布到npm上后別人使用找不到靜態庫的問題。

一、編寫原生模塊代碼

1、創建原生模塊

選中我們創建的BGNativeModuleExample靜態庫,然后在BGNativeModuleExample.h文件中導入RCTBridgeModule.h,讓BGNativeModuleExample類遵循RCTBridgeModule協議。

  1. //BGNativeModuleExample.h文件的內容如下 
  2. #import #import "RCTBridgeModule.h" 
  3. @interface BGNativeModuleExample : NSObject @end 

在BGNativeModuleExample.m文件中,我們需要實現RCTBridgeModule協議。為了實現 RCTBridgeModule協議,我們的類需要包含RCT_EXPORT_MODULE()宏。這個宏也可以添加一個參數用來指定在 Javascript中訪問這個模塊的名字。如果不指定,默認會使用這個類的名字。

在這里,我們指定了模塊的名字為BGNativeModuleExample。

  1. RCT_EXPORT_MODULE(BGNativeModuleExample); 

實現了RCTBridgeModule協議之后,我們就可以在js中如下獲取到我們創建的原生模塊。

  1. import { NativeModules } from 'react-native'
  2. var BGNativeModuleExample = NativeModules.BGNativeModuleExample; 

需要注意的是,RCT_EXPORT_MODULE宏傳遞的參數不能是OC中的字符串。如果傳遞 @“BGNativeModuleExample",那么我們導出給JS的模塊名字其實是@"BGNativeModuleExample",使用 BGNativeModuleExample就找不到了。在這里,我們其實可以通過打印NativeModules來查找到我們創建的原生模塊。

2、為原生模塊添加方法

我們需要明確的聲明要給JS導出的方法,否則ReactNative不會導出任何方法。聲明通過RCT_EXPORT_METHOD()宏來實現:

  1. RCT_EXPORT_METHOD(testPrint:(NSString *)name info:(NSDictionary *)info) { 
  2.   RCTLogInfo(@"%@: %@", name, info); 

在JS中,我們可以這樣調用這個方法:

  1. BGNativeModuleExample.testPrint("Jack", { 
  2.   height: '1.78m'
  3.   weight: '7kg' 
  4. }); 

3、參數類型

RCT_EXPORT_METHOD()支持所有標準的JSON類型,包括:

  • string (NSString)

  • number (NSInteger, float, double, CGFloat, NSNumber)

  • boolean (BOOL, NSNumber)

  • array (NSArray) 包含本列表中任意類型

  • map (NSDictionary) 包含string類型的鍵和本列表中任意類型的值

  • function (RCTResponseSenderBlock)

除此以外,任何RCTConvert類支持的的類型也都可以使用(參見RCTConvert了解更多信息)。RCTConvert還提供了一系列輔助函數,用來接收一個JSON值并轉換到原生Objective-C類型或類。

了解更多請點擊原生模塊

4、回調函數

警告:本章節內容目前還處在實驗階段,因為我們還并沒有太多的實踐經驗來處理回調函數。

回調函數,在官方的文檔中是有上面的一個警告,不過在使用過程暫時未發現問題。在OC中,我們添加一個getNativeClass方法,將當前模塊的類名回調給JS。

  1. RCT_EXPORT_METHOD(getNativeClass:(RCTResponseSenderBlock)callback) { 
  2.   callback(@[NSStringFromClass([self class])]); 

在JS中,我們通過以下方式獲取到原生模塊的類名

  1. BGNativeModuleExample.getNativeClass(name => { 
  2.   console.log("nativeClass: ", name); 
  3. }); 

原生模塊通常只應調用回調函數一次。但是,它們可以保存callback并在將來調用。這在封裝那些通過“委托函數”來獲得返回值的iOS API時最常見。

5、Promises

原生模塊還可以使用promise來簡化代碼,搭配ES2016(ES7)標準的async/await語法則效果更佳。如果橋接原生方法的最后兩 個參數是RCTPromiseResolveBlock和RCTPromiseRejectBlock,則對應的JS方法就會返回一個Promise對 象。

我們通過Promises來實現原生模塊是否會響應方法,響應則返回YES,不響應則返回一個錯誤信息,代碼如下:

  1. RCT_REMAP_METHOD(testRespondMethod, 
  2.                  name:(NSString *)name 
  3.                  resolver:(RCTPromiseResolveBlock)resolve 
  4.                  rejecter:(RCTPromiseRejectBlock)reject) { 
  5.   if([self respondsToSelector:NSSelectorFromString(name)]) { 
  6.     resolve(@YES); 
  7.   } 
  8.   else { 
  9.     reject(@"-1001", @"not respond this method", nil); 
  10.   } 

在JS中,我們有兩種方式調用,第一種是通過then....catch的方式:

  1. BGNativeModuleExample.testRespondMethod("dealloc"
  2.     .then(result => { 
  3.       console.log("result is ", result); 
  4.     }) 
  5.     .catch(error => { 
  6.       console.log(error); 
  7.     }); 

第二種是通過try...catch來調用,與第一種相比,第二種會報警告”Possible Unhandled Promiss Rejection (id:0)“。

  1. async testRespond() { 
  2. try { 
  3.   var result = BGNativeModuleExample.testRespondMethod("hell"); 
  4.   if(result) { 
  5.     console.log("respond this method"); 
  6.   } 
  7. catch (e) { 
  8.   console.log(e); 
  9.   } 

注意: 如果使用Promiss我們不需要參數,則在OC去掉name那一行就行了;如果需要多個參數,在name下面多加一行就行了,注意它們之間不需要添加逗號。

6、多線程

我們這里操作的模塊沒有涉及到UI,所以專門建立一個串行的隊列給它使用,如下:

  1. return dispatch_queue_create("com.liuchungui.demo", DISPATCH_QUEUE_SERIAL); 

注意: 在模塊之間共享分發隊列 

methodQueue方法會在模塊被初始化的時候被執行一次,然后會被React Native的橋接機制保存下來,所以你不需要自己保存隊列的引用,除非你希望在模塊的其它地方使用它。但是,如果你希望在若干個模塊中共享同一個隊列, 則需要自己保存并返回相同的隊列實例;僅僅是返回相同名字的隊列是不行的。

更多線程的操作細節可以參考:http://reactnative.cn/docs/0.24/native-modules-ios.html#content

7、導出常量

原生模塊可以導出一些常量,這些常量在JavaScript端隨時都可以訪問。用這種方法來傳遞一些靜態數據,可以避免通過bridge進行一次來回交互。

OC中,我們實現constantsToExport方法,如下:

  1. - (NSDictionary *)constantsToExport { 
  2.   return @{ @"BGModuleName" : @"BGNativeModuleExample"
  3.             TestEventName: TestEventName 
  4.             }; 

JS中,我們打印一下這個常量

  1. console.log("BGModuleName value is ", BGNativeModuleExample.BGModuleName); 

但是注意這個常量僅僅在初始化的時候導出了一次,所以即使你在運行期間改變constantToExport返回的值,也不會影響到JavaScript環境下所得到的結果。

8、給JS發送事件

即使沒有被JS調用,本地模塊也可以給JS發送事件通知。最直接的方式是使用eventDispatcher。

在這里,我們為了能夠接收到事件,我們開一個定時器,每一秒發送一次事件。

  1. #import "BGNativeModuleExample.h" 
  2. #import "RCTEventDispatcher.h" 
  3. @implementation BGNativeModuleExample 
  4. @synthesize bridge = _bridge; 
  5. - (instancetype)init { 
  6.   if(self = [super init]) { 
  7.     [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(sendEventToJS) userInfo:nil repeats:YES]; 
  8.   } 
  9.   return self; 
  10. - (void)receiveNotification:(NSNotification *)notification { 
  11.   [self.bridge.eventDispatcher sendAppEventWithName:TestEventName body:@{@"name": @"Jack"}]; 
  12. @end 

在JS中,我們這樣接收事件

  1. NativeAppEventEmitter.addListener(BGNativeModuleExample.TestEventName, info => { 
  2.       console.log(info); 
  3.     }); 

注意: 編寫OC代碼時,需要添加@synthesize bridge = _bridge;,否則接收事件的時候就會報Exception -[BGNativeModuleExample brige]; unrecognized selector sent to instance的錯誤。

上面原生代碼就編寫好了,主要以代碼實踐為主,彌補官方文檔中的一些不足,如果要需要了解更多的原生模塊封裝的知識,可以參考原生模塊,也可以參考官方的源代碼。

二、發布上線

我們按照上面步驟編寫好原生模塊之后,接下來將我們寫的原生模塊發布到npm。

1、我們需要創建github倉庫

在github上創建一個倉庫react-native-BGNativeModuleExample,然后關聯到我們前面創建的react-native-BGNativeModuleExample目錄

  1. $ cd TestProject/node_modules/react-native-BGNativeModuleExample 
  2. $ git init . 
  3. $ git remote add origin https://github.com/liuchungui/react-native-BGNativeModuleExample.git 

2、我們需要創建原生模塊的入口文件

我們需要在react-native-BGNativeModuleExample目錄下創建一個index.js,它是整個原生模塊的入口,我們這里只是將原生進行導出。

  1. //index.js 
  2. import React, { NativeModules } from 'react-native'
  3. module.exports = NativeModules.BGNativeModuleExample; 

3、發布到npm

在發布到npm之前,我們需要創建一個package.json文件,這個文件包含了module的所有信息,比如名稱、版本、描述、依賴、作者、 license等。 我們在react-native-BGNativeModuleExample根目錄下使用npm init命令來創建package.json,系統會提示我們輸入所需的信息,不想輸入的直接按下Enter跳過。

  1. $ npm init 
  2. This utility will walk you through creating a package.json file. 
  3. It only covers the most common items, and tries to guess sensible defaults. 
  4. See `npm help json` for definitive documentation on these fields 
  5. and exactly what they do
  6. Use `npm install  --save` afterwards to install a package and 
  7. save it as a dependency in the package.json file. 
  8. Press ^C at any time to quit. 
  9. name: (react-native-BGNativeModuleExample) 

輸入完成之后,系統會要我們確認文件的內容是否有誤,如果沒有問題直接輸入yes,那么package.json就創建好了。 我這里創建的package.json文件如下:

  1.   "name""react-native-nativemodule-example"
  2.   "version""1.0.0"
  3.   "description"""
  4.   "main""index.js"
  5.   "scripts": { 
  6.     "test""echo \"Error: no test specified\" && exit 1" 
  7.   }, 
  8.   "repository": { 
  9.     "type""git"
  10.     "url""git+https://github.com/liuchungui/react-native-BGNativeModuleExample.git" 
  11.   }, 
  12.   "author"""
  13.   "license""ISC"
  14.   "bugs": { 
  15.     "url""https://github.com/liuchungui/react-native-BGNativeModuleExample/issues" 
  16.   }, 
  17.   "homepage""https://github.com/liuchungui/react-native-BGNativeModuleExample#readme" 

如果我們編寫的原生模塊依賴于其他的原生模塊,我們需要在package.json添加依賴關系,我們這里由于沒有相關依賴,所以不需要添加:

  1. "dependencies": { 

初始化完package.json,我們就可以發布到npm上面了。

如果沒有npm的賬號,我們需要注冊一個賬號,這個賬號會被添加到npm本地的配置中,用來發布module用。

  1. $ npm adduser 
  2. Username: your name 
  3. Password: your password 
  4. Email: yourmail@gmail.com 

成功之后,npm會把認證信息存儲在~/.npmrc中,并且可以通過以下命令查看npm當前使用的用戶:

  1. $ npm whoami 

以上完成之后,我們就可以進行發布了。

  1. $npm publish 
  2. + react-native-nativemodule-example@1.0.0 

到這里,我們已經成功把module發布到了npmjs.org。當然,我們也別忘記將我們的代碼發布到github。

  1. $ git pull origin master 
  2. $ git add . 
  3. $ git commit -m 'add Project' 
  4. $ git push origin master 

有時候,有些文件沒必要發布,例如Example文件,我們就可以通過.npmignore忽略它。例如我這里.npmignore文件內容如下:

  1. Example/ 
  2. .git 
  3. .gitignore 
  4. .idea 

這樣的話,我們npm進行發布的時候,就不會將Example發布到npm上了。

4、添加Example,測試是否可用,添加README

我們在react-native-BGNativeModuleExample目錄下創建一個Example的ReactNative工程,并且通 過rnpm install react-native-nativemodule-example命令安裝我們發布的react-native-nativemodule- example模塊。

  1. $ rnpm install react-native-nativemodule-example 
  2. TestProject@0.0.1 /Users/user/github/TestProject 
  3. └── react-native-nativemodule-example@1.0.0 
  4. rnpm-link info Linking react-native-nativemodule-example ios dependency 
  5. rnpm-link info iOS module react-native-nativemodule-example has been successfully linked 
  6. rnpm-link info Module react-native-nativemodule-example has been successfully installed & linked 

上面提示安裝并且link成功,我們就可以在js中進行使用了。

  1. import BGNativeModuleExample from 'react-native-nativemodule-example'
  2. BGNativeModuleExample.testPrint("Jack", { 
  3.     height: '1.78m'
  4.     weight: '7kg' 
  5. }); 

5、我們在發布上線之后還需要編寫README文件。

README文件是非常重要的,如果沒有README文件,別人看到我們的原生組件,根本就不知道我們這個組件是用來干啥的。所以,我們很有必要添加一個README文件,這個文件需要告訴別人我們這個原生組件是干什么的、如何安裝、API、使用手冊等等。

6、原生模塊升級,發布新版本

當我們添加新代碼或者修復bug后,需要發布新的版本,我們只需要修改package.json文件中的version的值就行了,然后使用npm publish進行發布。

總結

本篇文章主要分成兩個部分,一是講述了編寫原生模塊的知識,二是將我們編寫的內容發布到npm上。

參考

如何發布Node模塊到NPM社區

原生模塊

責任編輯:倪明 來源: 劉春桂的博客
相關推薦

2016-08-23 13:53:25

iOS開發邏輯

2023-12-26 10:04:29

Electron應用開發框架

2011-08-03 13:43:50

iOS程序 打包 發布

2016-12-22 19:53:46

AndroidAPPReactNative

2014-07-23 13:17:53

iOSUITextField

2014-07-21 14:49:35

iOSUILabel

2016-11-23 16:48:20

react-nativandroidjavascript

2015-09-11 09:15:32

RyuSDN

2015-09-22 09:50:36

FacebookAndroid

2011-08-02 11:07:42

iOS開發 UIWebView

2017-02-15 09:25:36

iOS開發MQTT

2015-03-30 12:13:23

React NativiOS

2011-08-11 16:50:04

iOSTwitter

2011-08-15 11:13:06

IOS開發并發Dispatch Qu

2011-04-18 10:16:30

WEB高性能

2015-10-10 16:02:36

React NativAndroid

2013-07-29 04:51:41

iOS開發iOS開發學習file列表查看

2013-04-11 16:08:50

iOS開發技巧積累

2013-07-25 15:19:23

iOS開發學習Xcode打包framiOS開發
點贊
收藏

51CTO技術棧公眾號

国产精品女主播在线观看| 国产亚洲午夜| 亚洲电影在线看| 黄色免费观看视频网站| 日本网站在线免费观看视频| 国产一区二区三区四区五区入口 | 免费日本一区二区三区视频| 国产剧情av麻豆香蕉精品| 97在线看福利| 欧美日韩色视频| 亚洲精品亚洲人成在线| 9191成人精品久久| 18禁男女爽爽爽午夜网站免费| 日本福利在线| 91丨porny丨户外露出| 91精品国产自产在线| 免费在线不卡视频| 午夜久久一区| 中文字幕在线观看亚洲| 亚洲国产果冻传媒av在线观看| 美女视频一区| 日韩欧美在线视频免费观看| 女人床在线观看| 成人亚洲综合天堂| 9人人澡人人爽人人精品| 成人亚洲欧美一区二区三区| 亚洲成人第一网站| 亚洲日本欧美| 欧美黄色免费网站| 欧美肥妇bbwbbw| 欧美另类69xxxxx| 日韩精品在线观看视频| 男人女人拔萝卜视频| 成人性片免费| 一本大道久久a久久综合| 无码熟妇人妻av在线电影| 免费观看在线黄色网| 国产人久久人人人人爽| 欧美性bbwbbwbbwhd| 天堂中文在线资源| 大尺度一区二区| 99re视频| 亚洲国产精品一| 国模一区二区三区白浆| 国产色视频一区| 最近中文字幕av| 日韩国产在线观看一区| 琪琪第一精品导航| 你懂的国产在线| 国产麻豆综合| 日本人成精品视频在线| 少妇一级淫片免费放中国 | 中文字幕一区二区三区不卡在线| 日本一区二区精品| 日本私人网站在线观看| 91理论电影在线观看| 久久99欧美| 日本福利午夜视频在线| 26uuu亚洲综合色| 免费国产在线精品一区二区三区| 亚洲 精品 综合 精品 自拍| 99久久精品国产导航| 岛国视频一区免费观看| 秋霞av鲁丝片一区二区| 99久久久国产精品| 久久伦理网站| 成人在线二区| 亚洲欧美色图小说| 国产二区视频在线| 亚洲妇女成熟| 欧美在线免费视屏| 91视频这里只有精品| 国产精品一区二区精品| 日韩欧美在线1卡| 先锋资源av在线| 精品视频网站| 久热精品视频在线观看| 青青草精品在线视频| 最新亚洲视频| 国产精品jvid在线观看蜜臀| 在线观看日批视频| 国产成人av电影| 日韩精品伦理第一区| 男人和女人做事情在线视频网站免费观看| 亚洲丝袜自拍清纯另类| 人人妻人人澡人人爽欧美一区双| 在线观看爽视频| 欧美乱熟臀69xxxxxx| 性久久久久久久久久久| 成人a'v在线播放| 久久精品99国产精品酒店日本 | 欧美午夜精品| 青青青国产精品一区二区| 伊人久久亚洲综合| 成人aaaa免费全部观看| 亚洲韩国在线| a级片免费在线观看| 欧美写真视频网站| 99免费观看视频| 三级电影一区| 97avcom| 一级成人免费视频| 成人aa视频在线观看| 最新精品视频| 欧美gay视频| 欧美成人一区二区| 亚洲一二三精品| 在线视频亚洲| 97人人模人人爽人人少妇| 国产福利在线| 亚洲h精品动漫在线观看| 亚洲天堂2018av| 香蕉视频一区| 久久久久久伊人| 国产又粗又猛又爽又黄视频| 久久久久99精品国产片| 欧日韩免费视频| 久久精品免视看国产成人| 亚洲视频在线视频| 亚洲国产成人精品激情在线| 国产精品一品二品| 亚洲日本一区二区三区在线不卡| 日产福利视频在线观看| 精品奇米国产一区二区三区| 情侣偷拍对白清晰饥渴难耐| 久久黄色影院| 精品网站在线看| 日日夜夜天天综合入口| 91精品久久久久久蜜臀| 18精品爽国产三级网站| 米奇777在线欧美播放| 国产综合欧美在线看| 亚洲丝袜一区| 日韩一区二区三区四区 | 色爱综合网欧美| 国产精品久久久久久久久久99 | 一级片在线观看视频| 久久精品亚洲国产奇米99| 欧美视频在线播放一区| 福利片一区二区| 欧美激情第6页| 精品国产无码一区二区三区| 亚洲欧美激情一区二区| 涩涩网站在线看| 9191国语精品高清在线| 国产日韩在线播放| 黄视频网站在线| 欧美一区二区三区婷婷月色 | 黄色av网站在线免费观看| 欧美视频第一页| 97超碰在线资源| 日韩一区欧美二区| 五码日韩精品一区二区三区视频| 婷婷综合六月| 中文字幕不卡av| 在线中文字幕网站| **性色生活片久久毛片| 97超碰人人看| 亚洲网址在线| 精品无人乱码一区二区三区的优势| 午夜伦理福利在线| 亚洲视频欧美视频| 亚洲中文字幕一区二区| 亚洲婷婷在线视频| 日韩大尺度视频| 国产欧美欧美| 视频一区视频二区视频三区高| av一区在线播放| 久久天天躁日日躁| 高h震动喷水双性1v1| 精品久久久久久久大神国产| 欧美精品黑人猛交高潮| 日韩高清一区二区| 青春草在线视频免费观看| 成人h动漫免费观看网站| 久久久亚洲精选| 国产精品免费观看| 6080亚洲精品一区二区| 国产一级特黄aaa大片| 91美女精品福利| 182午夜视频| 夜久久久久久| 亚洲最新免费视频| 国产在线播放精品| 国产精品吹潮在线观看| av网站导航在线观看免费| 日韩精品免费在线| 国产乱码精品一区二三区蜜臂| 亚洲国产日韩一级| 我不卡一区二区| 成人毛片在线观看| 香港日本韩国三级网站| 伊人激情综合| 一区二区日本| 日韩精品丝袜美腿| 成人在线国产精品| 三级成人黄色影院| 久久久久久一区二区三区 | 亚洲精华一区二区三区| 国产视频999| 波多视频一区| 色综合久久悠悠| 国产视频三级在线观看播放| 欧美一级生活片| 日韩xxx视频| 午夜久久久久久久久| a一级免费视频| 2021久久国产精品不只是精品| 一级黄色片在线免费观看| 美女精品在线观看| 精品国产一区二区三区无码| 91亚洲一区| 区一区二区三区中文字幕| caoporn成人免费视频在线| 国产美女直播视频一区| 不卡av播放| 26uuu另类亚洲欧美日本一| 最近中文字幕免费mv2018在线| 国产亚洲精品va在线观看| 熟妇人妻av无码一区二区三区| 欧美日韩精品一区视频| 无码人妻久久一区二区三区不卡| 亚洲午夜久久久久久久久电影网 | 午夜精品久久久久久久蜜桃app| 蜜臀av午夜精品久久| 国产精品免费观看视频| 精品人妻无码一区| 久久久久国产一区二区三区四区| 800av在线播放| 成人高清视频在线| 91人人澡人人爽| 国模大尺度一区二区三区| 污视频网址在线观看| 人人超碰91尤物精品国产| 成人黄色片视频| 性欧美精品高清| 免费看一级大黄情大片| 亚洲视频观看| 国产九色porny| 亚洲网站啪啪| 日韩伦理在线免费观看| 亚洲网址在线| 国产免费黄色小视频| 亚洲精选在线| av免费观看网| 久久青草久久| 三级在线免费看| 麻豆精品久久精品色综合| 亚洲高清免费在线观看| 毛片一区二区三区| 嫩草视频免费在线观看| 国产一区在线精品| 免费观看黄网站| 不卡的看片网站| 亚洲av成人片色在线观看高潮| 91视频国产资源| 亚洲精品成人无码| 国产精品久久久久久亚洲毛片 | 国产精品视频入口| 精品国产午夜肉伦伦影院| 精品欧美一区二区三区久久久 | 国产成人精品综合在线观看| 手机在线观看日韩av| 丁香激情综合五月| 亚洲午夜久久久久久久久红桃| 欧美国产一区二区在线观看 | 在线一区免费| 日本福利视频网站| 在线视频精品| 天天操,天天操| 国产乱人伦偷精品视频免下载| 国产性猛交96| 久久综合国产精品| 国产免费嫩草影院| 亚洲午夜国产一区99re久久| www.国产一区二区| 欧美丰满高潮xxxx喷水动漫| 亚洲免费一级片| 亚洲欧美第一页| 高清免费电影在线观看| 97视频在线观看网址| 成人亚洲视频| 国产精品免费一区二区三区观看 | 精品无码国模私拍视频| 天堂在线一区二区| 国产91在线免费观看| 99精品视频中文字幕| 岛国片在线免费观看| 亚洲国产精品一区二区www在线| 国产精品suv一区| 日韩欧美综合在线| 黄色毛片在线看| 欧美激情视频一区二区| 欧美日韩视频免费观看| 91在线看网站| 深爱激情综合| 国产精品无码免费专区午夜| 日韩成人免费电影| 波多野结衣有码| 亚洲欧美怡红院| 波多野结衣啪啪| 欧美成人欧美edvon| 91社区在线观看| 欧美中文字幕在线视频| 在线日韩成人| 亚洲欧美日韩精品综合在线观看| 夜久久久久久| 精品国产aⅴ一区二区三区东京热 久久久久99人妻一区二区三区 | 荫蒂被男人添免费视频| 亚洲三级视频在线观看| 性色av免费观看| 亚洲国产中文字幕在线观看| 国产视频在线播放| 国产成人久久久| 欧美交a欧美精品喷水| 免费日韩在线观看| 精品亚洲成a人在线观看| 日韩精品无码一区二区三区久久久 | 国产麻豆视频一区二区| jizz18女人高潮| 色婷婷香蕉在线一区二区| 蜜臀av在线观看| 欧美日韩福利电影| 国产视频网站一区二区三区| 杨幂一区欧美专区| 奇米综合一区二区三区精品视频| 国产精品无码午夜福利| 精品久久久久国产| 少妇高潮一区二区三区99小说| 欧美美女15p| 欧美经典影片视频网站| 伊人狠狠色丁香综合尤物| 日本午夜精品一区二区三区电影| 成年人网站免费在线观看| 欧美日韩视频免费播放| 先锋av资源站| 26uuu日韩精品一区二区| 麻豆精品99| 黄色大片在线免费看| 成人一级片网址| 久久久久久久久久久97| 日韩精品一区二| 牛牛在线精品视频| 国产日韩三区| 国产亚洲毛片| 99久久久无码国产精品衣服| 色哟哟日韩精品| porn亚洲| 国产噜噜噜噜久久久久久久久| 首页国产精品| www.色.com| 亚洲午夜久久久久久久久久久 | www.xxxx精品| 国产日韩中文在线中文字幕| 国产在线xxxx| 9i在线看片成人免费| 一本一道无码中文字幕精品热| 亚洲人成绝费网站色www| 777午夜精品电影免费看| 亚洲日本欧美在线| 国产成人亚洲综合色影视| 久久综合综合久久| 精品视频久久久久久久| 日本一区二区三区视频在线| 中文字幕乱码一区二区三区| 国产精品亚洲成人| 日韩成人免费观看| 亚洲午夜女主播在线直播| 欧美在线一级| 800av在线免费观看| 久久蜜桃一区二区| 一级特黄aaa大片| 欧美精品videosex极品1| 天天操综合520| 中文字幕 日韩 欧美| 一区二区三区色| 国产日本在线视频| 亚洲影院在线看| 亚洲欧美日本日韩| 久久av红桃一区二区禁漫| 亚洲大胆美女视频| 久久青草视频| 免费看国产一级片| 国产精品污污网站在线观看 | 成人网在线免费视频| 亚洲国产精品无码久久久| 久久国产加勒比精品无码| 美女网站色精品尤物极品姐弟| 国产九九热视频| 亚洲五码中文字幕| 中文字幕日本在线观看| 国产精品国色综合久久| 日韩中文欧美在线| 久久9999久久免费精品国产| 最近2019中文字幕大全第二页| 97久久综合精品久久久综合| 日韩精品你懂的| 红桃视频成人在线观看| 国产cdts系列另类在线观看| 欧洲精品国产|