日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

xcode扩展_如何将Xcode插件转换为Xcode扩展名

發布時間:2023/11/29 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 xcode扩展_如何将Xcode插件转换为Xcode扩展名 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

xcode擴展

by Khoa Pham

通過Khoa Pham

如何將Xcode插件轉換為Xcode擴展名 (How to convert your Xcode plugins to Xcode extensions)

Xcode is an indispensable IDE for iOS and macOS developers. From the early days, the ability to build and install custom plugins had given us a huge boost in productivity. It was not long before Apple introduced Xcode extension due to privacy concerns.

Xcode是iOS和macOS開發人員必不可少的IDE。 從早期開始,構建和安裝自定義插件的能力就極大地提高了我們的生產率。 由于隱私方面的考慮,不久之后蘋果推出了Xcode擴展。

I have built a few Xcode plugins and extensions like XcodeWay, XcodeColorSense, XcodeColorSense2, and Xmas. It was a rewarding experience. I learned a lot, and the productivity I gained was considerable. In this post I walkthrough how I converted my Xcode plugins to extensions, and the experience I had in doing so.

我構建了一些Xcode插件和擴展,例如XcodeWay , XcodeColorSense , XcodeColorSense2和Xmas 。 這是一次有益的經歷。 我學到了很多東西,獲得的生產力相當可觀。 在這篇文章中,我將逐步介紹如何將Xcode插件轉換為擴展程序,以及這樣做的經驗。

我的第一個Xcode插件:XcodeWay (My first Xcode plugin: XcodeWay)

I choose a lazy person to do a hard job. Because a lazy person will find an easy way to do it我選擇一個懶惰的人去努力。 因為一個懶惰的人會找到一種簡單的方法

I really like the above quote from Bill Gates. I try to avoid repetitive and boring tasks. Whenever I find myself doing the same tasks again, I write scripts and tools to automate that. Doing this takes some time, but I will be a bit lazier in the near future.

我真的很喜歡比爾·蓋茨的上述話 。 我盡量避免重復和無聊的任務。 每當我發現自己再次執行相同的任務時,我就會編寫腳本和工具來自動執行該任務。 這樣做需要一些時間,但在不久的將來我會變得有些懶惰。

Besides the interest in building open source frameworks and tools, I like to extend the IDE I’m using — mostly Xcode.

除了對構建開源框架和工具感興趣之外,我還喜歡擴展我正在使用的IDE(主要是Xcode)。

I first started iOS development in 2014. I wanted a quick way to navigate to many places right from Xcode with the context of the current project. There are many times we want to:

我于2014年首次開始iOS開發。我想要一種快速的方法,可以從Xcode到當前項目的上下文直接導航到許多地方。 我們想多次:

  • open the current project folder in “Finder” to change some files

    在“ Finder”中打開當前項目文件夾以更改某些文件
  • open Terminal to run some commands

    打開終端以運行一些命令
  • open the current file in GitHub to quickly give the link to a workmate

    在GitHub中打開當前文件,以快速將鏈接提供給同事
  • or to open other folders like themes, plugins, code snippets, device logs.

    或打開其他文件夾,例如主題,插件,代碼段,設備日志。

Every little bit of time we save each day counts.

我們每天節省的每一分時間都很重要。

I thought it would be cool idea to write an Xcode plugin that we can do all above things right inside Xcode. Instead of waiting for other people to do it, I pulled up my sleeve and wrote my first Xcode plugin — XcodeWay— and shared it as open source.

我認為編寫一個Xcode插件是一個很酷的主意,我們可以在Xcode內完成上述所有操作。 我沒有等著別人去做,而是袖手旁觀 ,寫了我的第一個Xcode插件XcodeWay ,并將其作為開源共享。

什么是Xcode插件? (What are Xcode plugins?)

Xcode plugins are not officially supported by Xcode or recommended by Apple. There are no documents about them. The best places we can learn about them are via existing plugins’ source code and a few tutorials.

Xcode官方不支持Xcode插件或Apple不推薦使用。 沒有關于它們的文件。 我們可以通過現有插件的源代碼和一些教程來了解它們的最佳位置。

An Xcode plugin is just a bundle of type xcplugin and is placed at ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins . Xcode, when starting, will load any Xcode plugins present in this folder. Plugins are run in the same process as Xcode, so could do anything as Xcode. A bug in any plugin can cause Xcode to crash.

Xcode插件只是xcplugin類型的捆綁包,位于~/Library/Application Support/Developer/Shared/Xcode/Plug-ins 。 Xcode啟動時將加載此文件夾中存在的所有Xcode插件。 插件與Xcode的運行過程相同,因此可以像Xcode一樣執行任何操作。 任何插件中的錯誤都可能導致Xcode崩潰。

To make an Xcode plugin, create a macOS Bundle with one class that extends from NSObject , and have an initialiser that accepts NSBundle , for example in Xmas:

要制作Xcode插件,請創建一個macOS Bundle ,其中包含一個從NSObject擴展的類,并具有一個接受NSBundle的初始化程序,例如在Xmas中 :

class Xmas: NSObject {var bundle: NSBundleinit(bundle: NSBundle) { self.bundle = bundle super.init() }}

Inside Info.plist, we need to:

在Info.plist內部,我們需要:

  • declare this class as the main entry class for the plugin, and

    將該類聲明為插件的主要入口類,然后
  • that this bundle has no UI, because we create UI controls and add to the Xcode interface during runtime

    該捆綁包沒有UI,因為我們在運行時創建了UI控件并將其添加到Xcode接口
<key>NSPrincipalClass</key><string>Xmas</string><key>XCPluginHasUI</key><false/>

Another problem with Xcode plugins is that we have to continuously update DVTPluginCompatibilityUUIDs . This changes every time a new version of Xcode comes out. Without updating, Xcode will refuse to load the plugin.

Xcode插件的另一個問題是,我們必須不斷更新DVTPluginCompatibilityUUIDs 。 每當新版本的Xcode出現時,這種情況都會改變。 如果不進行更新,Xcode將拒絕加載插件。

Xcode插件可以做什么 (What Xcode plugins can do)

Many developers build Xcode plugins because they miss specific features found in other IDEs like Sublime Text, AppCode, or Atom.

許多開發人員之所以構建Xcode插件,是因為它們缺少其他IDE(例如Sublime Text,AppCode或Atom)中的特定功能。

Since Xcode plugins are loaded in the same process as Xcode, they can do everything that Xcode can. The only limit is our imagination. We can leverage Objective C Runtime to discover private frameworks and functions. Then LLDB and Symbolic breakpoint can be used further to inspect running code and alter their behaviors. We can also use swizzling to change implementation of any running code. Writing Xcode plugins is hard — lots of guessing, and sometimes a good knowledge of assembly is required.

由于Xcode插件的加載過程與Xcode相同,因此它們可以完成Xcode可以執行的所有操作。 唯一的限制是我們的想象力。 我們可以利用Objective C運行時來發現私有框架和功能。 然后,可以進一步使用LLDB和符號斷點來檢查正在運行的代碼并更改其行為。 我們還可以使用swizzling更改任何正在運行的代碼的實現。 編寫Xcode插件很辛苦–猜測很多,有時還需要一定的匯編知識。

In the golden age of plugins, there was a popular plugin manager, which itself was a plugin, called Alcatraz. It could install other plugins, which basically just downloads the xcplugin file and moves this to the Plug Ins folder.

在插件的黃金時代,有一個流行的插件管理器,它本身就是一個名為Alcatraz的插件。 它可以安裝其他插件,這些插件基本上只下載xcplugin文件并將其移至Plug Ins文件夾。

To get a sense of what plugins can do, let’s take a look at some popular plugins.

為了了解插件可以做什么,讓我們看一些流行的插件。

Xvim (Xvim)

First in the list is Xvim, which adds Vim keybindings right inside Xcode. It supports mostly all of the keybindings that we used to have in Terminal.

列表中的第一個是Xvim ,它在Xcode內部添加了Vim綁定。 它幾乎支持我們過去在Terminal中擁有的所有鍵綁定。

SCXcodeMiniMap (SCXcodeMiniMap)

If you miss MiniMap mode in Sublime Text, you can use SCXcodeMiniMap to add a right map panel inside Xcode editor.

如果您錯過了Sublime Text中的MiniMap模式,則可以使用SCXcodeMiniMap在Xcode編輯器中添加一個右側地圖面板。

FuzzyAutocomplete插件 (FuzzyAutocompletePlugin)

Before version 9, Xcode didn’t have proper auto completion — it was just based on prefix. That was where FuzzyAutocompletePlugin shone. It performs fuzzy auto completion based on the hidden IDEOpenQuicklyPattern feature in Xcode.

在版本9之前,Xcode沒有適當的自動完成功能-它僅基于前綴。 那就是FuzzyAutocompletePlugin發光的地方。 它基于Xcode中隱藏的IDEOpenQuicklyPattern功能執行模糊自動完成。

KSImageNamed-Xcode (KSImageNamed-Xcode)

To display a bundle image inside UIImageView, we often use the imageNamed method. But remembering exactly the name of the image file is hard. KSImageNamed-Xcode is here to help. You will get a list of auto-suggested image names when you begin to type.

為了在UIImageView顯示捆綁圖像,我們經常使用imageNamed方法。 但是準確記住圖像文件的名稱很困難。 KSImageNamed-Xcode在這里可以提供幫助。 開始鍵入時,您將獲得一個自動建議的圖像名稱列表。

Xcode的ColorSense (ColorSense-for-Xcode)

Another itch during development is to work with UIColor , which uses RGBA color space. We don’t get a visual indicator of the color that we specify, and manually performing checking can be time consuming. Luckily there is ColorSense-for-Xcode which shows the color being used and the color picker panel to easily select the right color.

開發過程中的另一個難題是使用UIColor ,后者使用RGBA顏色空間。 我們沒有看到指定顏色的視覺指示器,并且手動執行檢查可能很耗時。 幸運的是,這里有ColorSense-for-Xcode ,它可以顯示正在使用的顏色,而顏色選擇器面板則可以輕松選擇正確的顏色。

鏈接控制臺 (LinkedConsole)

In AppCode, we can jump to a specific line in the file that is logged inside the console. If you miss this feature in Xcode, you can use LinkedConsole. This enables clickable links inside Xcode console so we can jump to that file instantly.

在AppCode中,我們可以跳到控制臺內部記錄的文件中的特定行。 如果您錯過了Xcode中的此功能,則可以使用LinkedConsole 。 這將在Xcode控制臺中啟用可單擊的鏈接,因此我們可以立即跳轉到該文件。

Xcode插件背后的艱苦工作 (The hard work behind Xcode plugins)

Making an Xcode plugin is not easy. Not only do we need to know macOS programming, but we also need to dive deep into Xcode view hierarchy. We need to explore private frameworks and APIs in order to inject the feature we want.

制作Xcode插件并不容易。 我們不僅需要了解macOS編程,而且還需要深入了解Xcode視圖層次結構。 我們需要探索私有框架和API,以便注入我們想要的功能。

There are very few tutorials on how to make plugins but, luckily, most plugins are open source so we can understand how they work. Since I have made a few plugins, I can give some technical details about them.

關于如何制作插件的教程很少,但幸運的是,大多數插件都是開源的,因此我們可以了解它們的工作原理。 由于我做了一些插件,因此我可以提供一些有關它們的技術細節。

Xcode plugins are done usually with two private frameworks: DVTKit and IDEKit . System frameworks are at /System/Library/PrivateFrameworks but the frameworks that Xcode uses exclusively are under /Applications/Xcode.app/Contents/ , there you can find Frameworks , OtherFrameworks and SharedFrameworks.

Xcode插件通常使用兩個私有框架完成: DVTKit和IDEKit 。 系統框架位于/System/Library/PrivateFrameworks但Xcode專用的框架位于/Applications/Xcode.app/Contents/下,您可以在其中找到Frameworks , OtherFrameworks和SharedFrameworks 。

There is a tool class-dump that can generate headers from the Xcode app bundle. With the class names and methods, you can call NSClassFromString to get the class from the name.

有一個工具類轉儲 ,可以從Xcode應用程序捆綁包生成標頭。 使用類名和方法,可以調用NSClassFromString從名稱中獲取類。

Xmas中令人費解的DVTBezelAlertPanel框架 (Swizzling DVTBezelAlertPanel framework in Xmas)

Christmas has always given me a special feeling, so I decided to make Xmas, which shows a random Christmas picture instead of the default alert view. The class used to render that view is DVTBezelAlertPanel inside the DVTKit framework. My article on building that plugin is here.

圣誕節總是給我一種特殊的感覺,所以我決定制作Xmas ,它顯示隨機的圣誕節圖片而不是默認的警報視圖。 用于渲染視圖類是DVTBezelAlertPanel的DVTKit框架內。 我有關構建該插件的文章在這里。

With Objective C Runtime, there is a technique called swizzling, which can change and switch implementation and method signature of any running classes and methods.

使用Objective C Runtime,有一種稱為swizzling的技術,它可以更改和切換任何正在運行的類和方法的實現以及方法簽名。

Here, in order to change the content of that alert view, we need to swap the initialiser initWithIcon:message:parentWindow:duration: with our own method. We do that early by listening to NSApplicationDidFinishLaunchingNotification which is notified when a macOS plugin, in this case Xcode, launches.

在這里,為了更改該警報視圖的內容,我們需要使用我們自己的方法交換初始化程序 initWithIcon:message:parentWindow:duration: 我們通過偵聽NSApplicationDidFinishLaunchingNotification此操作,當macOS插件(在本例中為Xcode)啟動時會收到通知。

class func swizzleMethods() { guard let originalClass = NSClassFromString("DVTBezelAlertPanel") as? NSObject.Type else { return }do { try originalClass.jr_swizzleMethod("initWithIcon:message:parentWindow:duration:", withMethod: "xmas_initWithIcon:message:parentWindow:duration:") } catch { Swift.print("Swizzling failed") }}

I initially liked to do everything in Swift. But it’s tricky to use the swizzle init method in Swift, so the quickest way is to do that in Objective C. Then we simply traverse the view hierarchy to find the NSVisualEffectView inside NSPanel to update the image.

我最初喜歡在Swift中做所有事情。 但是在Swift中使用s wizzle init方法很棘手,因此最快的方法是在Objective C中做到這一點。 然后,我們只需遍歷視圖層次結構, NSVisualEffectView在NSPanel找到NSPanel來更新圖像。

與XcodeColorSense中的DVTSourceTextView進行交互 (Interacting with DVTSourceTextView in XcodeColorSense)

I work mostly with hex colors and I want a quick way to see the color. So I built XcodeColorSense — it supports hex color, RGBA, and named color.

我主要處理十六進制顏色,我想快速查看顏色。 因此,我構建了XcodeColorSense-它支持十六進制顏色,RGBA和命名的顏色。

The idea is simple. Parse the string to see if the user is typing something related to UIColor, and show a small overlay view with that color as background. The text view that Xcode uses is of type DVTSourceTextView in DVTKit framework. We also need to listen to NSTextViewDidChangeSelectionNotification which is triggered whenever any NSTextView content is changed.

這個想法很簡單。 解析字符串以查看用戶是否正在輸入與UIColor相關的內容,并顯示一個以該顏色為背景的小疊加視圖。 該Xcode使用文本視圖是一個類型的DVTSourceTextView在DVTKit框架。 我們還需要收聽NSTextViewDidChangeSelectionNotification ,只要更改任何NSTextView內容,就會觸發該事件。

func listenNotification() { NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(handleSelectionChange(_:)), name: NSTextViewDidChangeSelectionNotification, object: nil)}func handleSelectionChange(note: NSNotification) { guard let DVTSourceTextView = NSClassFromString("DVTSourceTextView") as? NSObject.Type, object = note.object where object.isKindOfClass(DVTSourceTextView.self), let textView = object as? NSTextView else { return }self.textView = textView}

I had a Matcher architecture so we can detect different kinds of UIColor constructions — for example HexMatcher .

我有一個Matcher架構,因此我們可以檢測到不同種類的UIColor構造-例如HexMatcher 。

public struct HexMatcher: Matcher {func check(line: String, selectedText: String) -> (color: NSColor, range: NSRange)? { let pattern1 = "\"#?[A-Fa-f0-9]{6}\"" let pattern2 = "0x[A-Fa-f0-9]{6}"let ranges = [pattern1, pattern2].flatMap { return Regex.check(line, pattern: $0) }guard let range = ranges.first else { return nil }let text = (line as NSString).substringWithRange(range).replace("0x", with: "").replace("\"", with: "") let color = NSColor.hex(text)return (color: color, range: range) }}

To render the overlay, we use NSColorWell which is good for showing a view with background. The position is determined by calling firstRectForCharacterRange and some point conversions with convertRectFromScreen and convertRect .

要渲染疊加層,我們使用NSColorWell ,它非常適合顯示帶有背景的視圖。 通過調用firstRectForCharacterRange并通過convertRectFromScreen和convertRect一些點轉換來確定位置。

在XcodeWay中使用NSTask和IDEWorkspaceWindowController (Using NSTask and IDEWorkspaceWindowController in XcodeWay)

Finally, my beloved XcodeWay.

最后,我心愛的XcodeWay 。

I found myself needing to go to different places from Xcode with the context of the current project. So I built XcodeWay as a plugin that adds lots of handy menu options under Window.

我發現自己需要根據當前項目的上下文從Xcode轉到其他地方。 因此,我將XcodeWay構建為插件,在Window下添加了許多方便的菜單選項。

Since the plugin runs in the same Xcode process, it has access to the main menu NSApp.mainMenu?.itemWithTitle(“Window”) . There we can alter the menu. XcodeWay is designed to easily extend functionalities through its Navigator protocol.

由于插件在相同的Xcode進程中運行,因此可以訪問主菜單NSApp.mainMenu?.itemWithTitle(“Window”) 。 在那里我們可以更改菜單。 XcodeWay旨在通過其Navigator協議輕松擴展功能。

@objc protocol Navigator: NSObjectProtocol { func navigate() var title: String { get }}

For folders with a static path like Provisioning Profile ~/Library/MobileDevice/Provisioning Profiles or User data Developer/Xcode/UserData , we can just construct the URL and call NSWorkspace.sharedWorkspace().openURL . For dynamic folders that vary depending on the current project, more work needs to be done.

對于具有靜態路徑的文件夾,例如Provisioning ~/Library/MobileDevice/Provisioning Profiles或User data Developer/Xcode/UserData ,我們可以僅構造URL并調用NSWorkspace.sharedWorkspace().openURL 。 對于根據當前項目而變化的動態文件夾,需要做更多的工作。

How do we open the folder for the current project in Finder? The information for the current project path is kept inside IDEWorkspaceWindowController . This is a class that manages workspace windows in Xcode. Take a look at EnvironmentManager where we use objc_getClass to get the class definition from a string.

我們如何在Finder中打開當前項目的文件夾? 當前項目路徑的信息保存在IDEWorkspaceWindowController 。 這是一個管理Xcode中的工作區窗口的類。 看一下EnvironmentManager ,我們在其中使用objc_getClass從字符串獲取類定義。

self.IDEWorkspaceWindowControllerClass = objc_getClass("IDEWorkspaceWindowController");NSArray *workspaceWindowControllers = [self.IDEWorkspaceWindowControllerClass valueForKey:@"workspaceWindowControllers"];id workSpace = nil;for (id controller in workspaceWindowControllers) { if ([[controller valueForKey:@"window"] isEqual:[NSApp keyWindow]]) { workSpace = [controller valueForKey:@"_workspace"]; }}NSString * path = [[workSpace valueForKey:@"representingFilePath"] valueForKey:@"_pathString"];

Finally, we can utilise valueForKey to get the value for any property that we think exists. This way not only do we get the project path, we also get the path to the opening file. So we can call activateFileViewerSelectingURLs on NSWorkspace to open Finder with that file selected. This is handy as users don’t need to look for that file in Finder.

最后,我們可以利用valueForKey來獲取我們認為存在的任何屬性的值。 這樣,我們不僅可以獲取項目路徑 ,還可以獲取打開文件的路徑。 因此,我們可以在NSWorkspace上調用activateFileViewerSelectingURLs來打開選擇了該文件的Finder。 這很方便,因為用戶不需要在Finder中查找該文件。

Many times we want to execute some Terminal commands on the current project folder. To achieve that, we can use NSTask with launch pad /usr/bin/open and arguments [@”-a”, @”Terminal”, projectFolderPath] . iTerm, if configured probably, will open this in a new tab.

很多時候,我們想在當前項目文件夾中執行一些終端命令。 為此,我們可以將NSTask與啟動板/usr/bin/open和參數[@”-a”, @”Terminal”, projectFolderPath] 。 iTerm(如果已配置)將在新選項卡中將其打開。

The documents for iOS 7 apps are placed in the fixed location iPhone Simulator inside Application Support. But, from iOS 8, every app has a unique UUID and their document folders are hard to predict.

iOS 7應用程序的文檔放在應用程序支持內的固定位置iPhone Simulator 。 但是,從iOS 8開始,每個應用程序都具有唯一的UUID,并且其文檔文件夾很難預測。

~/Library/Developer/CoreSimulator/Devices/1A2FF360-B0A6-8127-95F3-68A6AB0BCC78/data/Container/Data/Application/

We can build a map and perform tracking to find the generated ID for the current project, or to check the plist inside each folder to compare the bundle identifier.

我們可以構建地圖并執行跟蹤以找到當前項目的生成ID,或者檢查每個文件夾中的plist以比較包標識符。

The quick solution that I came up with was to search for the most recent updated folder. Every time we build the project, or make changes inside the app, their document folder is updated. That is where we can make use of NSFileModificationDate to find the folder for the current project.

我想到的快速解決方案是搜索最近更新的文件夾。 每次我們構建項目或在應用程序中進行更改時,其文檔文件夾都會更新。 那是我們可以使用NSFileModificationDate查找當前項目的文件夾的地方。

There are many hacks when working with Xcode plugins, but the results are rewarding. Every few minutes we save each day end up saving a lot of time overall.

使用Xcode插件時有很多技巧,但結果是可喜的。 我們每天節省的每一分鐘最終節省了很多時間。

安全與自由 (Security and freedom)

With great power comes great responsibility. The fact that plugins can do whatever they want rings an alert to security. In late 2015, there was a malware attack by distributing a modified version of Xcode, called XcodeGhost, which injects malicious code into any apps built with Xcode Ghost. The malware is believed to use the plugin mechanism among other things.

擁有權利的同時也被賦予了重大的責任。 插件可以做任何他們想做的事情,這一事??實提醒了安全性。 在2015年末,通過分發Xcode的修改版本XcodeGhost進行了惡意軟件攻擊,該代碼將惡意代碼注入到使用Xcode Ghost構建的任何應用程序中。 據信該惡意軟件除其他外還使用了插件機制。

Like the iOS apps we download from the Appstore, macOS apps like Xcode are signed by Apple when we download them from the Mac Appstore or through official Apple download links.

就像我們從Appstore下載的iOS應用程序一樣,當我們從Mac Appstore或通過Apple官方下載鏈接下載macOS應用程序(如Xcode)時,它們也會由Apple 簽名 。

Code signing your app assures users that it is from a known source and the app hasn’t been modified since it was last signed. Before your app can integrate app services, be installed on a device, or be submitted to the App Store, it must be signed with a certificate issued by Apple

對您的應用程序進行代碼簽名可確保用戶來自已知來源,并且自上次簽名以來未對其進行過修改。 您的應用程序可以集成應用程序服務,安裝在設備上或提交到App Store之前,必須使用Apple發行的證書進行簽名

To avoid potential malware like this, at WWDC 2016 Apple announced the Xcode Source Editor Extension as the only way to load third party extensions into Xcode. This means that, from Xcode 8, plugins can’t be loaded.

為了避免此類潛在的惡意軟件,Apple在WWDC 2016上宣布了Xcode Source Editor Extension ,這是將第三方擴展加載到Xcode中的唯一方法。 這意味著無法從Xcode 8加載插件。

源代碼編輯器擴展 (Source Editor Extension)

Extension is the recommended approach to safely add functionalities in restricted ways.

建議使用擴展來以受限方式安全添加功能。

App extensions give users access to your app’s functionality and content throughout iOS and macOS. For example, your app can now appear as a widget on the Today screen, add new buttons in the Action sheet, offer photo filters within the Photos app, or display a new system-wide custom keyboard.

應用程序擴展使用戶可以在整個iOS和macOS中訪問您應用程序的功能和內容。 例如,您的應用現在可以在“今日”屏幕上顯示為小部件,在“操作”表中添加新按鈕,在“照片”應用中提供照片濾鏡或顯示新的系統范圍的自定義鍵盤。

For now, the only extension to Xcode is Source Editor, which allows us to read and modify contents of a source file, as well as read and modify the current text selection within the editor.

目前,Xcode的唯一擴展是Source Editor,它使我們能夠讀取和修改源文件的內容,以及讀取和修改編輯器中的當前文本選擇。

Extension is a new target and runs in a different process than Xcode. This is good in that it can’t alter Xcode in any ways other than conforming to XCSourceEditorCommand to modify the current document content.

擴展是一個新的目標,并且在與Xcode不同的過程中運行。 這樣做的好處是,除了遵循XCSourceEditorCommand來修改當前文檔內容外,它無法以其他任何方式更改Xcode。

protocol XCSourceEditorCommand {func perform(with invocation: XCSourceEditorCommandInvocation, completionHandler: @escaping (Error?) -&gt; Void)}

Xcode 8 has lots of improvements like the new code completion features, Swift image and color literals, and snippets. This led to the deprecation of many Xcode plugins. For some indispensable plugins like XVim, this is unbearable for some people. Some old plugin features can’t be achieved with the current Source Editor Extension system.

Xcode 8進行了許多改進,例如新的代碼完成功能,Swift圖像和顏色文字以及代碼片段。 這導致了許多Xcode插件的棄用。 對于某些不可缺少的插件(例如XVim),這對于某些人來說是無法忍受的。 當前的Source Editor Extension系統無法實現某些舊的插件功能。

除非您辭職Xcode (Unless you resign Xcode)

A workaround to bypass the restriction from Xcode 8 for plugins, is to replace the existing Xcode signature by a technique called resign. Resigning is very easy — we just need to create a self-signed certificate and call the codesign command. After this, Xcode should be able to load plugins.

繞過插件的Xcode 8限制的一種解決方法是,使用稱為resign的技術替換現有的Xcode簽名。 簽名非常容易-我們只需要創建一個自簽名證書并調用codesign命令即可。 此后,Xcode應該能夠加載插件。

codesign -f -s MySelfSignedCertificate /Applications/Xcode.app

It is, however, not possible to submit apps built with resigned Xcode as the signature does not match the official version of Xcode. One way is to use two Xcodes: one official for distribution and one resigned for development.

但是,由于簽名與Xcode的正式版本不匹配, 因此無法提交使用已簽名的Xcode構建的應用程序。 一種方法是使用兩個Xcode:一個用于發布的官方文件,一個用于開發的辭職文件。

移至Xcode擴展 (Moving to Xcode extension)

Xcode extension is the way to go, so I started moving my plugins to extension. For Xmas, since it modifies view hierarchy, it can’t become an extension.

Xcode擴展是必經之路,因此我開始將插件移至擴展。 對于Xmas,由于它修改了視圖層次結構,因此不能成為擴展。

XcodeColorSense2中的顏色文字 (Color literal in XcodeColorSense2)

For the color sense, I rewrote the extension from scratch, and called it XcodeColorSense2. This, of course, can’t show an overlay over the current editor view. So I chose to utilize the new Color literal found in Xcode 8+.

對于顏色,我從頭開始重寫了擴展名,并將其命名為XcodeColorSense2 。 當然,這不能在當前編輯器視圖上顯示覆蓋。 因此,我選擇使用Xcode 8+中新的Color literal 。

The color is shown in a small box. It may be hard to distinguish similar colors, so that’s why I also include the name. The code is simply about inspecting selections and parsing to find the color declaration.

顏色顯示在一個小框中。 區分相似的顏色可能很困難,因此這就是為什么我也要包括該名稱的原因。 該代碼僅涉及檢查selections和解析以查找顏色聲明。

func perform(with invocation: XCSourceEditorCommandInvocation, completionHandler: @escaping (Error?) -> Void ) -> Void { guard let selection = invocation.buffer.selections.firstObject as? XCSourceTextRange else { completionHandler(nil) return }let lineNumber = selection.start.lineguard lineNumber < invocation.buffer.lines.count, let line = invocation.buffer.lines[lineNumber] as? String else { completionHandler(nil) return }guard let hex = findHex(string: line) else { completionHandler(nil) return }let newLine = process(line: line, hex: hex)invocation.buffer.lines.replaceObject(at: lineNumber, with: newLine)completionHandler(nil) }}

Most of the functionality is embedded inside my framework Farge, but I can’t find a way to use the framework inside Xcode extension.

大多數功能都嵌入在我的框架Farge中 ,但是我找不到在Xcode擴展中使用該框架的方法。

Since the extension feature is only accessible through the Editor menu, we can customise a key binding to invoke this menu item. For example I choose Cmd+Ctrl+S to show and hide color information.

由于只能通過“編輯器”菜單訪問擴展功能,因此我們可以自定義按鍵綁定來調用此菜單項。 例如,我選擇Cmd+Ctrl+S來顯示和隱藏顏色信息。

This is, of course, not intuitive compared to the original plugin, but it’s better than nothing.

與原始插件相比,這當然不直觀,但是總比沒有好。

如何調試Xcode擴展 (How to debug Xcode extensions)

Working and debugging extensions is straightforward. We can use Xcode to debug Xcode. The debugged version of Xcode has a gray icon.

工作和調試擴展很簡單。 我們可以使用Xcode調試Xcode。 Xcode的調試版本帶有灰色圖標。

如何安裝Xcode擴展 (How to install Xcode extensions)

The extension must have an accompanying macOS app. This can be distributed to Mac Appstore or self-signed. I’ve written an article on how to do this.

該擴展程序必須具有隨附的macOS應用程序。 它可以分發到Mac Appstore或自簽名。 我寫了一篇有關如何做到這一點的文章 。

All extensions for an app need to be explicitly enabled through “System Preferences”.

必須通過“系統偏好設置”顯式啟用應用程序的所有擴展。

The Xcode extension only works with editor for now, so we must open a source file for the Editor menu to have effect.

Xcode擴展名目前僅適用于編輯器,因此我們必須打開源文件以使“ Editor菜單生效。

XcodeWay中的AppleScript (AppleScript in XcodeWay)

In Xcode extensions, NSWorkspace, NSTask and private class construction don’t work anymore. Since I have used Finder Sync Extension in FinderGo, I thought I could try the same AppleScript scripting for Xcode extension.

在Xcode擴展中, NSWorkspace , NSTask和私有類構造不再起作用。 由于我已經在FinderGo中使用了Finder Sync Extension, 因此我認為我可以為Xcode擴展嘗試相同的AppleScript腳本。

AppleScript is a scripting language created by Apple. It allows users to directly control scriptable Macintosh applications, as well as parts of macOS itself. You can create scripts — sets of written instructions — to automate repetitive tasks, combine features from multiple scriptable applications, and create complex workflows.

AppleScript是Apple創建的一種腳本語言。 它允許用戶直接控制可編寫腳本的Macintosh應用程序以及macOS本身的一部分。 您可以創建腳本(一組書面說明)來自動化重復的任務,組合來自多個可編寫腳本的應用程序中的功能以及創建復雜的工作流程。

To try AppleScript, you can use the app Script Editor built inside macOS to write prototype functions. Function declaration starts with on and ends with end . To avoid potential conflicts with system functions, I usually use my as a prefix. Here is how I rely on System Events to get the home directory.

要嘗試AppleScript,可以使用macOS內置的應用程序腳本編輯器編寫原型函數。 函數聲明以on開頭,以end 。 為了避免與系統功能發生潛在沖突,我通常使用my作為前綴。 這是我依靠系統事件獲取主目錄的方式。

User interface scripting terminology is found in the “Processes Suite” of the “System Events” scripting dictionary. This suite includes terminology for interacting with most types of user interface elements, including:

用戶界面腳本術語可在“系統事件”腳本字典的“進程套件”中找到。 該套件包括用于與大多數類型的用戶界面元素進行交互的術語,包括:

  • windows

    視窗
  • buttons

    紐扣
  • checkboxes

    復選框
  • menus

    菜單
  • radio buttons

    單選按鈕
  • text fields.

    文本字段。

In System Events, the process class represents a running app.

在系統事件中, process類表示一個正在運行的應用程序。

Many good citizen apps support AppleScript by exposing some of their functionalities, so these can be used by other apps. Here is how I get the current song from Spotify in Lyrics.

許多優秀的公民應用程序通過公開其某些功能來支持AppleScript,因此它們可以被其他應用程序使用。 這是我從Spotify的Lyrics中獲取當前歌曲的方式。

tell application "Spotify" set trackId to id of current track as string set trackName to name of current track as string set artworkUrl to artwork url of current track as string set artistName to artist of current track as string set albumName to album of current track as string return trackId & "---" & trackName & "---" & artworkUrl & "---" & artistName & "---" & albumNameend tell

To get all the possible commands of a certain app, we can open the dictionary in Script Editor. There we can learn about which functions and parameters are supported.

要獲取某個應用程序的所有可能命令,我們可以在腳本編輯器中打開字典。 在這里,我們可以了解支持哪些功能和參數。

If you think Objective C is hard, AppleScript is much harder. The syntax is verbose and error-prone. For your reference, here is the whole script file that powers XcodeWay.

如果您認為Objective C很難,AppleScript就會困難得多。 語法冗長且容易出錯。 供您參考,這是為XcodeWay提供支持的整個腳本文件 。

To open a certain folder, tell Finder using POSIX file. I refactor every functionality into function for better code reuse.

要打開某個文件夾,請使用POSIX file告訴Finder 。 我將每個功能重構為功能,以實現更好的代碼重用。

on myOpenFolder(myPath)tell application "Finder"activateopen myPath as POSIX fileend tellend myOpenFolder

Then, to run AppleScript inside a macOS app or extension, we need to construct an AppleScript descriptor with the correct process serial number and event identifiers.

然后,要在macOS應用程序或擴展中運行AppleScript,我們需要使用正確的進程序列號和事件標識符構造一個AppleScript描述符。

func eventDescriptior(functionName: String) -> NSAppleEventDescriptor { var psn = ProcessSerialNumber(highLongOfPSN: 0, lowLongOfPSN: UInt32(kCurrentProcess)) let target = NSAppleEventDescriptor( descriptorType: typeProcessSerialNumber, bytes: &psn, length: MemoryLayout<ProcessSerialNumber>.size )let event = NSAppleEventDescriptor( eventClass: UInt32(kASAppleScriptSuite), eventID: UInt32(kASSubroutineEvent), targetDescriptor: target, returnID: Int16(kAutoGenerateReturnID), transactionID: Int32(kAnyTransactionID) )let function = NSAppleEventDescriptor(string: functionName) event.setParam(function, forKeyword: AEKeyword(keyASSubroutineName))return event}

Other tasks, like checking the current Git remote, are a bit trickier. Many times I want to share the link of the file I’m debugging to my remote teammate, so they know what file I’m referencing. This is doable by using shell script inside AppleScript .

其他任務,例如檢查當前的Git遙控器,則有些棘手。 很多時候,我想與遠程隊友共享正在調試的文件的鏈接,以便他們知道我正在引用的文件。 這可以通過在AppleScript使用shell script來實現。

on myGitHubURL()set myPath to myProjectPath()set myConsoleOutput to (do shell script "cd " & quoted form of myPath & "; git remote -v")set myRemote to myGetRemote(myConsoleOutput)set myUrl to (do shell script "cd " & quoted form of myPath & "; git config --get remote." & quoted form of myRemote & ".url")set myUrlWithOutDotGit to myRemoveSubString(myUrl, ".git")end myGitHubURL

We can use quoted and string concatenation to form strings. Luckily we can expose Foundation framework and certain classes. Here is how I expose NSString to take advantage of all existing functionalities. Writing string manipulation from scratch using plain AppleScript will take lots of time.

我們可以使用quoted和字符串串聯來形成字符串。 幸運的是,我們可以公開Foundation框架和某些類。 這是我公開NSString以利用所有現有功能的方式。 使用普通的AppleScript從頭開始編寫字符串操作將花費大量時間。

use scripting additionsuse framework "Foundation"property NSString : a reference to current application's NSString

With this we can build our other functions for string handling.

這樣我們就可以構建其他用于字符串處理的函數。

on myRemoveLastPath(myPath)set myString to NSString's stringWithString:myPathset removedLastPathString to myString's stringByDeletingLastPathComponentremovedLastPathString as textend myRemoveLastPath

One cool feature that XcodeWay supports is the ability to go to the document directory for the current app in the simulator. This is handy when we need to inspect a document to check saved or cached data. The directory is dynamic so it’s hard to detect. We can, however, sort the directory for the most recently updated. Below is how we chain multiple shell scripts commands to find the folder.

XcodeWay支持的一項很酷的功能是能夠轉到模擬器中當前應用程序的文檔目錄。 當我們需要檢查文檔以檢查保存或緩存的數據時,這非常方便。 該目錄是動態的,因此很難檢測到。 但是,我們可以對最新更新的目錄進行排序。 下面是我們如何鏈接多個shell scripts命令來查找文件夾的方法。

on myOpenDocument()set command1 to "cd ~/Library/Developer/CoreSimulator/Devices/;"set command2 to "cd `ls -t | head -n 1`/data/Containers/Data/Application;"set command3 to "cd `ls -t | head -n 1`/Documents;"set command4 to "open ."do shell script command1 & command2 & command3 & command4end myOpenDocument

This feature helped me a lot when developing Gallery to check whether videos and downloaded images are saved in the correct place.

開發Gallery來檢查視頻和下載的圖像是否保存在正確的位置時,此功能對我有很大幫助。

However, none of the scripts seem to work. Scripting has always been part of macOS since 1993. But, with the advent of the Mac Appstore and security concerns, AppleScript finally got restricted in mid 2012. That was when App Sandbox was enforced.

但是,這些腳本似乎都不起作用。 自1993年以來,腳本一直是macOS的一部分。但是,隨著Mac Appstore的問世和安全方面的考慮,AppleScript終于在2012年中期受到限制。

應用沙箱 (App Sandbox)

App Sandbox is an access control technology provided in macOS, enforced at the kernel level. It is designed to contain damage to the system and the user’s data if an app becomes compromised. Apps distributed through the Mac App Store must adopt App Sandbox.

App Sandbox是macOS中提供的一種訪問控制技術,在內核級別實施。 如果應用程序被盜用,它旨在包含對系統和用戶數據的破壞。 通過Mac App Store分發的應用程序必須采用App Sandbox 。

For an Xcode extension to be loaded by Xcode, it must also support App Sandbox.

對于要由Xcode加載的Xcode擴展,它還必須支持App Sandbox。

At the beginning of App Sandbox enforcement, we could use App Sandbox Temporary Exception to temporarily grant our app access to Apple Script.

在應用程序沙箱強制執行開始時,我們可以使用應用程序沙箱臨時異常臨時授予我們的應用程序對Apple Script的訪問權限。

This is now not possible.

現在這是不可能的。

The only way for AppleScript to run is if it resides inside ~/Library/Application Scripts folder.

AppleScript的唯一運行方式是駐留在~/Library/Application Scripts文件夾中。

如何安裝自定義腳本 (How to install custom scripts)

macOS apps or extensions can’t just install scripts into the Application Scripts by themselves. They need user consent.

macOS應用程序或擴展不能僅將腳本自身安裝到應用程序腳本中。 他們需要用戶的同意。

One possible way to do that is to enable Read/Write and show a dialog using NSOpenPanel to ask user to select the folder to install our scripts.

一種可行的方法是啟用“ Read/Write并使用NSOpenPanel顯示對話框,要求用戶選擇文件夾來安裝我們的腳本。

For XcodeWay, I choose to provide an install shell script so the user has a quick way to install scripts.

對于XcodeWay,我選擇提供安裝Shell腳本,以便用戶快速安裝腳本。

#!/bin/bashset -euo pipefailDOWNLOAD_URL=https://raw.githubusercontent.com/onmyway133/XcodeWay/master/XcodeWayExtensions/Script/XcodeWayScript.scptSCRIPT_DIR="${HOME}/Library/Application Scripts/com.fantageek.XcodeWayApp.XcodeWayExtensions"mkdir -p "${SCRIPT_DIR}"curl $DOWNLOAD_URL -o "${SCRIPT_DIR}/XcodeWayScript.scpt"

AppleScript is very powerful. All of this is made explicit so the user has complete control over which things can be done.

AppleScript非常強大。 所有這些都是明確的,因此用戶可以完全控制哪些事情可以完成。

Like an extension, a script is done asynchronously in a different process using XPC for inter process communication. This enhances security as a script has no access to the address space to our app or extension.

像擴展一樣,使用XPC在進程間進行通信的不同進程中異步完成腳本。 由于腳本無法訪問我們的應用或擴展程序的地址空間,因此可以提高安全性。

macOS Mojave中的更高安全性 (More security in macOS Mojave)

This year, at WWDC 2018, Apple introduced macOS Mojave which focuses on lots of security enhancements. In the Your Apps and the Future of macOS Security we can learn more about new security requirement for macOS apps. One of them is the usage description for AppleEvents.

今年,在WWDC 2018上,Apple推出了macOS Mojave,它專注于許多安全性增強功能。 在您的應用程序和macOS安全性的未來中,我們可以了解有關macOS應用程序的新安全性要求的更多信息。 其中之一是AppleEvents的用法說明。

unable to load info.plist exceptions (egpu overrides)無法加載info.plist異常(egpu覆蓋)

We used to declare usage description for many permissions in iOS, like photo library, camera, and push notifications. Now we need to declare the usage description for AppleEvents.

我們曾經在iOS中聲明許多權限的使用情況描述,例如照片庫,相機和推送通知。 現在我們需要聲明AppleEvents的用法描述。

The first time our extension tries to execute some AppleScript commands, the above dialog is shown to ask for user consent. User can grant or deny permission, but for Xcode please say yes ?

我們的擴展程序第一次嘗試執行某些AppleScript命令時,將顯示以上對話框,要求用戶同意。 用戶可以授予或拒絕權限,但是對于Xcode,請說是?

The fix for us is to declare NSAppleEventsUsageDescription in our app target. We only need to declare in the app target, not in the extension target.

我們的解決方法是在應用程序目標中聲明NSAppleEventsUsageDescription 。 我們只需要在應用程序目標中聲明,而無需在擴展目標中聲明。

<key>NSAppleEventsUsageDescription</key><string>Use AppleScript to open folders</string>

從這往哪兒走 (Where to go from here)

Huff huff, whew! Thanks for following such a long journey. Making frameworks and tools take lots of time, especially plugins and extensions — we have to continuously change to adapt them to new operating systems and security requirements. But it is a rewarding process, as we’ve learned more and have some tools to save our precious time.

呼呼,呼呼! 感謝您經過如此漫長的旅程。 制作框架和工具需要花費大量時間,尤其是插件和擴展-我們必須不斷進行更改以使它們適應新的操作系統和安全性要求。 但這是一個有益的過程,因為我們已經了解了更多,并擁有一些工具來節省寶貴的時間。

For your reference, here are my extensions which are fully open source.

供您參考,這是我的擴展程序,它們是完全開源的。

  • XcodeWay

    XcodeWay

  • XcodeColorSense2

    XcodeColorSense2

I hope you find something useful in the post. Here are some resources to help explore Xcode extensions further:

希望您在帖子中找到有用的信息。 以下是一些資源,可幫助您進一步探索Xcode擴展:

  • Xcode Plugins by NSHipster

    NSHipster的Xcode插件

  • Writing Xcode plugin in Swift

    在Swift中編寫Xcode插件

  • Xcode 8 Plugins (Alcatraz) — The end of an era

    Xcode 8插件(惡魔島)—時代的終結

  • Using and Extending the Xcode Source Editor

    使用和擴展Xcode源代碼編輯器

  • Why do I need to resign Xcode to use XVim2

    為什么我需要辭職Xcode才能使用XVim2

If you like this post, consider visiting my other articles and apps ?

如果您喜歡這篇文章,請考慮訪問我的其他文章和應用程序 ?

翻譯自: https://www.freecodecamp.org/news/how-to-convert-your-xcode-plugins-to-xcode-extensions-ac90f32ae0e3/

xcode擴展

總結

以上是生活随笔為你收集整理的xcode扩展_如何将Xcode插件转换为Xcode扩展名的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

成人av高清| 免费看一级片 | 中文字幕丝袜美腿 | 97电影在线观看 | 欧美日韩性视频在线 | 97超碰人人在线 | 久久久久久国产精品美女 | 黄色一级在线免费观看 | 在线中文字幕网站 | 成人久久18免费网站麻豆 | 69精品在线观看 | 国产自产在线视频 | 麻花豆传媒mv在线观看网站 | 91九色九色| 四虎影视成人精品国库在线观看 | 在线免费观看涩涩 | 国产成人精品一区二区三区福利 | 亚洲精品视频二区 | 99久久99久久精品国产片果冰 | 亚洲永久精品国产 | www.色国产 | www成人精品| 激情综合亚洲 | 国产精品美女毛片真酒店 | 国产一级精品绿帽视频 | 国产精品午夜av | 欧美9999 | 久久久精品国产一区二区电影四季 | 中文视频在线看 | 黄色美女免费网站 | 精品免费观看 | 久久久久久久久精 | 精品在线一区二区 | 伊人黄色网| 91香蕉亚洲精品 | 黄色综合 | 欧洲在线免费视频 | 亚洲区另类春色综合小说 | 亚洲一级在线观看 | www日韩视频| 中文字幕 欧美性 | 极品国产91在线网站 | 91系列在线观看 | 18国产精品白浆在线观看免费 | 五月婷综合 | 在线免费观看一区二区三区 | 日韩三级久久 | 精品国产成人在线 | 97人人人人| 免费的国产精品 | 日本爱爱免费视频 | 91视频麻豆视频 | 97超视频在线观看 | 色综合久久88色综合天天免费 | 狠狠干综合网 | 久久99免费| 五月婷久 | 97成人免费视频 | 国产婷婷一区二区 | 亚洲影院国产 | 欧美日韩综合在线 | 精品在线视频一区 | 狠狠色丁香婷婷综合欧美 | 久久一二三四 | 日韩午夜在线观看 | 在线观看亚洲国产 | 天天综合网 天天综合色 | 最近最新最好看中文视频 | 久久久久久久国产精品 | 亚洲成av人影院 | 免费黄色网址大全 | 欧美在线日韩在线 | 久久6精品 | 国产精品你懂的在线观看 | av丝袜制服 | 视频成人免费 | 一级欧美一级日韩 | 精品国产精品久久一区免费式 | 久久午夜影视 | 日本韩国欧美在线观看 | 国产精品永久免费观看 | 欧美大片在线看免费观看 | 黄色大片视频网站 | 91电影福利 | 99精品欧美一区二区三区 | 久久艹在线 | 四虎在线视频免费观看 | 久久精品中文字幕 | 在线电影 你懂得 | 国内精品久久久久久久影视简单 | 日韩国产精品久久久久久亚洲 | 99精品电影| 久一网站| 免费看片成年人 | 69久久久| 久久久久久毛片精品免费不卡 | 97国产精品一区二区 | 亚洲专区免费观看 | 天天综合天天做 | 国内少妇自拍视频一区 | 成人免费影院 | 国产一级二级av | 日韩在线视频网址 | 日日操网 | 亚洲伊人天堂 | 亚洲区精品| 97超级碰碰碰视频在线观看 | 国产色资源 | 亚洲一区尤物 | 夜夜爽天天爽 | www.色爱 | 国产精品美女久久久久久久网站 | 国产精品毛片一区二区在线 | 国产成人久久精品 | 中文字幕 国产视频 | 国产69精品久久久久99尤 | 欧美综合干 | 中文字幕第一页在线 | 国内偷拍精品视频 | 久久久久久久久久久国产精品 | 亚洲精品综合在线 | 成人黄大片 | 制服丝袜欧美 | 欧美精品二 | 亚州国产精品 | 免费精品国产 | 国产美女精品视频免费观看 | 国产 日韩 欧美 在线 | 福利一区二区 | 久久av免费观看 | 特级西西444www大精品视频免费看 | 免费黄色在线网站 | 国产亚洲精品久久久久久久久久 | 国产精品久久久久久久久久了 | 超碰97久久 | 九九热在线精品视频 | 999久久国产 | 亚洲视频电影在线 | 爱情影院aqdy鲁丝片二区 | 97色在线| 日韩欧美在线免费 | 98超碰在线| 青青草在久久免费久久免费 | 免费在线观看视频a | 久久成人毛片 | 亚洲精品在线观看视频 | 成年人在线观看 | 全黄网站| 日日操网 | 国产在线精品福利 | 中文字幕a∨在线乱码免费看 | 精品国产自 | 91视频免费 | 色妞久久福利网 | 在线观看mv的中文字幕网站 | 免费观看视频黄 | 青草视频免费观看 | 91福利视频免费 | 黄色成人免费电影 | 免费看黄色毛片 | 成人黄色在线看 | 中文字幕超清在线免费 | 天天躁天天躁天天躁婷 | 国产精品久久久久久69 | 国产精品一区二区免费在线观看 | 欧美综合久久久 | 亚洲综合成人专区片 | 中文字幕在线视频精品 | aaa日本高清在线播放免费观看 | 香蕉国产91 | 日韩三级视频在线观看 | 欧美精彩视频 | 九九免费精品视频 | 成片视频在线观看 | 在线免费观看视频一区二区三区 | 天天色天天色 | www日韩欧美 | 美女国内精品自产拍在线播放 | 日韩在线免费 | 国产精品黄色 | 欧美激情精品久久久久久 | 一区二区三区中文字幕在线观看 | 久久精品亚洲精品国产欧美 | 精品久久久久久国产 | 最新高清无码专区 | 日韩有码在线观看视频 | 九九交易行官网 | 99热.com | 国产成人精品一二三区 | 亚洲国产影院 | 日韩欧美综合视频 | 亚洲国产97在线精品一区 | 一区二区三区免费在线观看 | 国产999 | 婷婷中文字幕综合 | 国内精品久久久久久中文字幕 | 国产精品短视频 | 99热官网| 亚洲天天在线日亚洲洲精 | 国产一级电影免费观看 | 亚洲涩涩涩 | 亚洲成人精品影院 | 天天操夜夜曰 | 国产日韩精品一区二区在线观看播放 | 国产精品女主播一区二区三区 | www.黄色片.com | 狠狠色综合网站久久久久久久 | 在线中文字幕一区二区 | 在线免费观看国产 | 天堂中文在线播放 | 欧美视频xxx | 在线v片 | 国产精品美女在线观看 | 五月婷婷操 | 99热 精品在线 | 中文字幕av在线电影 | 亚洲精品视频中文字幕 | 久久免费资源 | 九九热在线视频免费观看 | 亚洲精品乱码久久久久久蜜桃欧美 | 狠狠操91| 激情文学丁香 | 99免费在线观看视频 | 久久久久在线观看 | 中文字幕在线观看一区二区 | 国产综合在线视频 | 91成人精品国产刺激国语对白 | 友田真希x88av | 日本中文字幕电影在线免费观看 | 99免费在线观看视频 | 蜜桃av久久久亚洲精品 | 日本久久久久久久久 | 亚洲另类人人澡 | 毛片一级免费一级 | 久草在线免费看视频 | 久久久久综合精品福利啪啪 | 天堂av在线7 | 国产3p视频| 国产日韩精品一区二区三区 | 国产精品九九久久99视频 | 日韩精品第1页 | 国产人成一区二区三区影院 | 日韩av一区二区在线影视 | 欧美日韩在线观看视频 | 亚洲伊人色 | 日韩精品不卡在线观看 | 一区在线观看 | 国产夫妻自拍av | 成人性生交大片免费观看网站 | 国产色婷婷精品综合在线手机播放 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 欧美日韩久久不卡 | 色人久久 | 精品一区二区综合 | 很黄很黄的网站免费的 | 久久99久久99精品免视看婷婷 | 精品主播网红福利资源观看 | 成人午夜电影久久影院 | av在线成人 | 免费亚洲黄色 | 日韩精品三区四区 | 久久精品久久综合 | 日韩精品一区二区不卡 | 国产精品免费大片视频 | 久久视频国产 | 黄色大片免费网站 | 久久看视频 | 中文字幕在线观看免费高清完整版 | 国产欧美久久久精品影院 | 99精品视频播放 | 在线v| 在线精品亚洲 | 久草在线这里只有精品 | 九九爱免费视频 | 中文字幕在线观看的网站 | 国产高清av | 国产日韩中文字幕 | 欧美一级黄色片 | 成人a级大片 | 狠狠的操| 久草视频中文 | 亚洲午夜不卡 | 精品免费视频123区 午夜久久成人 | 2024av| 国产精品一区二区免费在线观看 | 免费a v视频 | 中文字幕av一区二区三区四区 | 超碰激情在线 | 久草视频免费看 | 免费一级特黄录像 | 精品国产乱码久久久久久1区2匹 | 五月婷在线视频 | 九九热精品视频在线观看 | 精品视频久久久 | 在线观看免费视频 | 久久艹人人| 日韩在线视频免费看 | 国产又粗又猛又黄 | 国产中文伊人 | 欧美午夜a | 黄色三级免费片 | 一区二区三区免费在线 | 国产精品99久久99久久久二8 | 久久久久成人精品亚洲国产 | 成人免费看片98欧美 | 国内精品久久久久久久影视简单 | av久久久| 婷婷在线资源 | 蜜臀久久99精品久久久酒店新书 | 香蕉影视在线观看 | 色综合久久精品 | 久久成人免费 | 久久久www成人免费毛片麻豆 | 日韩高清激情 | 久久九九久久精品 | 国产品久精国精产拍 | 五月婷婷丁香综合 | 五月婷婷在线视频观看 | 久久国产精品99国产 | 久久99精品久久久久蜜臀 | 欧美一区二区三区不卡 | 玖玖玖精品 | 亚洲成人精品久久久 | 精品欧美一区二区在线观看 | 久久综合免费 | av天天在线观看 | 中文字幕在线看视频国产 | 免费在线观看成人小视频 | 99精品视频网| 五月天天av | 91丨九色丨国产在线观看 | 五月激情六月丁香 | 久久激情五月婷婷 | 欧美另类老妇 | 日韩一二区在线 | 国产在线a免费观看 | 成人四虎影院 | 久久免费国产电影 | www.福利视频 | 午夜av色 | 国产精品高清免费在线观看 | 日日日网| 在线天堂v | 欧美91av | 999在线视频| 成人久久18免费网站麻豆 | 亚洲一区黄色 | 亚洲最新视频在线播放 | 国产日女人 | 婷婷色网站 | 女人高潮一级片 | 99久久婷婷国产一区二区三区 | 国产免费一区二区三区网站免费 | 日韩欧美在线第一页 | 日韩午夜视频在线观看 | 免费看色网站 | www.xxxx变态.com | 色小说av| 精品999在线观看 | 丰满少妇麻豆av | 午夜影院一级片 | 国产高清视频在线播放 | 欧美激情视频久久 | 国产精品尤物 | 久久精品999 | 91亚洲永久精品 | 免费欧美精品 | 五月婷婷操 | 午夜资源站| 国产成人三级在线播放 | 麻花豆传媒mv在线观看 | 日韩黄色网络 | 波多在线视频 | av成人免费观看 | 天天爽网站| 国产精品3区 | 久久久久久国产一区二区三区 | 成人免费精品 | 99精品视频免费全部在线 | 九热在线 | 99精品国产99久久久久久福利 | 亚洲91精品 | 波多野结衣电影一区二区三区 | 亚洲天堂网在线视频观看 | 久久99久久99精品中文字幕 | 绯色av一区 | 成人免费看电影 | 91精品视频导航 | 欧美一性一交一乱 | 五月婷婷欧美视频 | 亚洲综合视频在线 | 在线观看国产一区二区 | 国产亚洲综合性久久久影院 | 国产精品久久久久久久久大全 | 国产精品一区二区免费在线观看 | 欧美亚洲三级 | 久草在线手机视频 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 国产第一二区 | 美女免费视频一区 | 黄p在线播放 | 欧美精品一区在线发布 | 亚洲欧美日韩精品一区二区 | 黄色av一区二区 | 麻豆传媒视频在线免费观看 | 伊人国产女 | 久热精品国产 | 五月婷婷中文网 | 久久久精品亚洲 | 激情婷婷丁香 | 免费看的黄色小视频 | 久久免费激情视频 | 国产麻豆精品在线观看 | 日韩资源在线 | 色婷婷国产精品一区在线观看 | 亚洲艳情| 黄色小网站免费看 | av观看免费在线 | 黄色avwww | 2019中文最近的2019中文在线 | 国产精品久久网 | 97电影在线 | 亚洲h色精品 | 国产精品久久久久久久久久久久午夜片 | 日日夜夜天天 | 三上悠亚在线免费 | 亚洲人成影院在线 | 九九九九热精品免费视频点播观看 | 成人久久毛片 | 日夜夜精品视频 | 人人爽人人爽人人片av | 成人蜜桃视频 | 免费av高清 | 最近中文字幕视频完整版 | 亚洲色图美腿丝袜 | a在线观看国产 | 色婷婷综合久久久 | 久久国内精品视频 | 日日夜夜精品视频天天综合网 | 伊人伊成久久人综合网站 | 国产第一页在线播放 | 91精品办公室少妇高潮对白 | 久久97精品 | 欧美一区二区精美视频 | 久久精品免费看 | 日产乱码一二三区别在线 | 国产免费中文字幕 | 丁香婷婷基地 | 欧美人交a欧美精品 | 开心激情五月婷婷 | 狠狠的干狠狠的操 | 日韩av图片 | 99自拍视频在线观看 | 草久在线 | 国产高清福利在线 | 日本视频精品 | 久久亚洲欧美日韩精品专区 | 午夜影院一级片 | 成年人免费电影在线观看 | 97国产一区 | 亚洲精品国产欧美在线观看 | 国产精品嫩草影院123 | 99久久久久久国产精品 | 国产精品99久久久久久人免费 | 九色在线 | 在线91视频 | 又黄又刺激的视频 | 天干啦夜天干天干在线线 | 九色在线视频 | aa级黄色大片 | 在线视频第一页 | 久久9精品 | 天天拍夜夜拍 | 国产精品福利午夜在线观看 | 国产护士hd高朝护士1 | 国产在线综合视频 | 日韩视频免费在线观看 | 欧美成人h版 | 国产精品v a免费视频 | 在线免费黄色av | 日韩美精品视频 | 在线观看国产成人av片 | 亚洲欧洲精品视频 | 日韩精品电影在线播放 | 香蕉成人在线视频 | 69精品久久久 | 人人干在线观看 | 日本少妇高清做爰视频 | 国产手机免费视频 | www.夜夜干.com | 一区二区三区久久精品 | 国产精品专区一 | 国产蜜臀av | 久久人人干 | 久久精品一级片 | 一区在线观看 | 国产成年人av | 91精品一区国产高清在线gif | 91精品播放 | 天天操天天摸天天爽 | 国产色视频一区二区三区qq号 | 在线电影日韩 | 97人人超碰在线 | 天天射天天射天天 | 国产亚洲精品久久网站 | 最新精品视频在线 | 午夜黄色一级片 | 免费色婷婷 | 丁香综合五月 | 久久久精品 | 激情电影在线观看 | 91热这里只有精品 | 亚洲国产精品人久久电影 | 一级久久精品 | 日韩a级免费视频 | 国内视频在线 | 亚洲综合在线观看视频 | 综合久久精品 | 国产专区在线播放 | 成人在线观看av | 日韩视频在线播放 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 在线观看黄色免费视频 | 操操碰| 成 人 a v天堂 | av成人资源 | 天天操天天添 | 亚洲国产中文在线 | 久久三级视频 | 综合色播| 韩国av在线 | 黄色毛片一级 | 一区电影| 国产精品原创 | 国产中文字幕91 | 人人澡人人爱 | 超碰在线观看99 | 国产精品人成电影在线观看 | 99久久精品视频免费 | 俺要去色综合狠狠 | 欧美精品一区二区免费 | 99夜色 | 国产日韩精品在线观看 | 免费大片黄在线 | 国产色视频网站 | 涩涩成人在线 | 亚洲欧美日韩在线看 | 人人爽人人av | 国内精品久久久久久中文字幕 | 欧美亚洲成人xxx | 国产精品久久久久久久免费 | 精品自拍网 | 首页国产精品 | 国产字幕在线看 | 亚洲激情小视频 | 国产高清一 | 国产精品嫩草影院123 | 丁香在线观看完整电影视频 | 日韩三级精品 | 91你懂的 | 色婷婷av国产精品 | 国产精品999久久久 久产久精国产品 | 亚洲伊人成综合网 | 人人干人人超 | 亚洲伦理电影在线 | 天天插天天 | 91成人看片| 久草在线免费电影 | 波多野结衣在线观看一区 | 国产自产在线视频 | 亚洲jizzjizz日本少妇 | 99精品视频一区二区 | 狠狠撸电影| 国产精品人人做人人爽人人添 | 少妇bbbb | 99精品在线 | 国产成人黄色网址 | 日韩在线中文字幕 | 久久精品网| 久色婷婷 | 国产日韩精品在线观看 | 午夜av免费 | 99热精品视 | 日本黄区免费视频观看 | 中文字幕视频一区二区 | 99久久影视| 免费a视频在线 | 97品白浆高清久久久久久 | 亚洲激情综合 | 国内精品久久久久久 | 国产精品1024 | 国产女教师精品久久av | 成年人免费在线观看网站 | 国产一区二区成人 | 欧美精品成人在线 | 又粗又长又大又爽又黄少妇毛片 | 天天干天天碰 | 国产精品美女久久久久久久久 | 久久精品久久久久电影 | 日日夜夜免费精品视频 | 国精产品999国精产 久久久久 | 久久精品成人欧美大片古装 | 伊人五月 | 在线视频91 | 最近中文字幕在线中文高清版 | 中文字幕亚洲五码 | 麻花豆传媒mv在线观看网站 | 中文字幕av一区二区三区四区 | 日韩高清不卡在线 | 日韩 在线观看 | 国产精品麻豆三级一区视频 | 岛国片在线 | 五月婷婷激情网 | 91色视频 | 精品久久久久久久久久 | 婷婷精品在线视频 | 热久久视久久精品18亚洲精品 | 久久兔费看a级 | 久草视频免费在线播放 | 国产精品手机在线播放 | 992tv又爽又黄的免费视频 | 国产第页 | 日韩动漫免费观看高清完整版在线观看 | 成人app在线播放 | 国产视频亚洲精品 | 欧美黄色免费 | 特级毛片爽www免费版 | 精品福利视频在线 | 色婷婷天天干 | 麻豆一区二区三区视频 | 日韩中文字幕电影 | 狠狠色噜噜狠狠 | 91精品国产三级a在线观看 | 人人澡人人舔 | 日韩免费一区二区在线观看 | 91视频一8mav | 伊人五月天.com | 久热av | 国产麻豆剧传媒免费观看 | 精品色999| 九草视频在线观看 | 99久久精品免费看国产 | 久久精品99精品国产香蕉 | 夜夜视频 | 97国产小视频 | 婷婷色资源 | 91麻豆产精品久久久久久 | 天天爱av导航 | 日韩中文字幕亚洲一区二区va在线 | 国产精品久久久久999 | 日韩a在线| 精品久久久久久国产偷窥 | 韩国在线一区二区 | 国产麻豆精品95视频 | 91亚洲欧美激情 | 亚洲精品黄色在线观看 | 国产精品亚洲综合久久 | 成人av电影免费在线观看 | 国产福利在线免费 | 国内成人精品2018免费看 | 成片免费观看视频 | 久草在线官网 | 国产99久久久国产精品成人免费 | 国产99久久精品一区二区300 | 青青五月天 | 色综合久久久久网 | 日韩三区在线观看 | 在线观看国产永久免费视频 | 91自拍视频在线观看 | 亚洲视频一 | 亚洲黄色在线观看 | av中文在线播放 | 99热在线免费观看 | 国产又粗又猛又色又黄视频 | 久久久久免费精品国产小说色大师 | 亚洲一级电影在线观看 | 欧美日韩国产高清视频 | 欧美婷婷综合 | 五月婷婷激情 | 麻豆国产精品va在线观看不卡 | 国产成人亚洲在线观看 | 国产97视频在线 | 九九天堂 | 91精品在线免费观看视频 | 在线视频99| 亚洲欧洲日韩在线观看 | 久久精品免费播放 | 久久人人添人人爽添人人88v | 久久综合久久久 | 亚洲日本三级 | 91| 97碰在线| 久久不射影院 | 狠狠色综合网站久久久久久久 | 最新中文字幕在线观看视频 | 国内精品小视频 | 亚洲综合五月天 | 国产精品婷婷 | 在线观看日本高清mv视频 | 免费在线观看午夜视频 | 国产精品午夜免费福利视频 | 色噜噜狠狠狠狠色综合 | 亚欧洲精品视频在线观看 | 免费观看国产成人 | 怡红院成人在线 | 精久久久久 | 日韩欧美在线影院 | 五月婷婷在线视频观看 | 精品国产免费一区二区三区五区 | 亚洲人久久久 | 成人a免费 | 又黄又刺激的视频 | 中文字幕在线视频网站 | 日韩精品免费专区 | 免费观看视频的网站 | 成人a免费 | 国产一区二区在线免费观看 | 欧美色图88 | 亚洲区视频在线 | 久久99精品一区二区三区三区 | 亚洲aaa级 | 国产美腿白丝袜足在线av | 日韩av一区二区三区四区 | 久久久久北条麻妃免费看 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 国产一级免费电影 | 99高清视频有精品视频 | 99精品视频免费看 | 在线精品一区二区 | 欧美大jb| 亚洲视频在线观看免费 | 91黄色在线视频 | 一区二区精品视频 | 亚洲精品xxx | 黄污在线看 | 亚洲综合在线五月天 | 久草在线在线视频 | 免费观看丰满少妇做爰 | 欧美高清成人 | 狠狠色伊人亚洲综合网站色 | 伊人天天狠天天添日日拍 | 天天干天天插伊人网 | 亚洲一级影院 | 在线视频 国产 日韩 | 欧美一级久久 | 人人讲 | 亚洲天堂社区 | 在线看片中文字幕 | 久久综合影音 | 国产久草在线观看 | 国产打女人屁股调教97 | 成人一区二区在线 | 中文字幕在线观看完整版电影 | 美女久久久久 | 69久久久久久久 | 国产精品一区免费看8c0m | 国产九九在线 | 国产精品日韩欧美一区二区 | 久久久久久久久影院 | 婷婷伊人五月 | 色在线国产 | 亚洲精品成人免费 | 激情中文字幕 | 婷婷网站天天婷婷网站 | 天天干天天草 | 色久av| 一区在线播放 | 国产精品一区二区精品视频免费看 | 久久不卡视频 | 婷婷精品在线视频 | 国产高清在线精品 | 77国产精品 | 亚洲精品视频在线观看视频 | 国产亚洲aⅴaaaaaa毛片 | 一区二区精品久久 | 中文字幕在线视频一区二区 | 色橹橹欧美在线观看视频高清 | 成年人视频在线免费播放 | 一区久久久 | av午夜电影 | 欧美大片第1页 | 久久久电影网站 | av蜜桃在线| 国产精品99久久免费观看 | 中文字幕视频免费观看 | 国产一区二区免费 | 少妇自拍av | 精品久久久久久久久亚洲 | 亚洲91中文字幕无线码三区 | 91系列在线观看 | 欧美一级久久久 | 久草视频免费在线播放 | 免费看的毛片 | 亚洲精品国偷拍自产在线观看 | 国产精品久久久久久999 | 国产精品一区二区三区久久久 | 亚洲天堂网在线观看视频 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 久久国产午夜精品理论片最新版本 | 欧美精品视 | 九九视频在线观看视频6 | 亚洲日本一区二区在线 | 日一日操一操 | 欧美日韩综合在线 | 久久精品一二三区白丝高潮 | 亚洲综合最新在线 | 欧美一区二区在线免费观看 | 高清av免费一区中文字幕 | 日韩精品播放 | 天天干.com| 日韩在线观看视频一区二区三区 | 国产精品一区二区久久精品爱涩 | 手机在线黄色网址 | 久久欧美视频 | 日韩三级视频 | 久久亚洲区 | 狠狠色香婷婷久久亚洲精品 | 久久一久久 | 五月天六月婷 | 麻豆精品视频 | www.夜夜操.com | www操操操| 美女福利视频在线 | 国产亚洲精品久久久久久网站 | 精品一区二区影视 | 日韩免费视频在线观看 | 日本一区二区不卡高清 | 欧美成年黄网站色视频 | 免费看黄色小说的网站 | 激情欧美xxxx| 欧美日韩成人 | 一区二区视频免费在线观看 | 九九久久久久久久久激情 | 国内精品久久久 | av大全在线观看 | 一区视频在线 | 黄网站app在线观看免费视频 | 日韩免费播放 | 久久久在线 | 午夜狠狠操 | 中文字幕在线观看网站 | 日韩欧美网址 | 欧美在线你懂的 | 探花视频在线观看+在线播放 | 天天摸天天弄 | 成人毛片一区 | 成av在线 | 99免费在线播放99久久免费 | 欧美成人区| 亚州av免费 | 久久无码精品一区二区三区 | 黄色av一区二区三区 | 91九色国产在线 | 国产片网站 | 911国产| 国产第一页在线观看 | 久久免费片 | 成人香蕉视频 | 国产成人在线观看 | 欧美 日韩 国产 成人 在线 | 国产精品成人一区二区三区吃奶 | 国产精品久久久久影院 | 激情xxxx | 久久在线视频在线 | 亚洲在线精品视频 | 最新av在线播放 | 国产高清不卡一区二区三区 | 国产精品久久久久久久久久新婚 | 国产中文字幕大全 | 久久精品福利 | 亚洲精品玖玖玖av在线看 | 丁香婷婷电影 | 美女黄网久久 | 国产高清视频免费在线观看 | 不卡av免费在线观看 | 热99在线| 成年人视频免费在线 | 免费中午字幕无吗 | 永久免费精品视频 | 国产一级h | 国产精品99久久久久久武松影视 | 色av婷婷 | 久久久黄色av | 激情小说网站亚洲综合网 | 三级黄色a| 国产91在线观看 | av理论电影 | av资源中文字幕 | 91在线日韩 | 青青河边草免费观看 | 97精品在线| 麻豆一二三精选视频 | 国产破处在线播放 | 精品国产精品久久一区免费式 | 国产一级淫片免费看 | 丁香花中文在线免费观看 | 欧美性受极品xxxx喷水 | 国产成人在线综合 | 日本精品视频在线观看 | 玖玖爱国产在线 | 成人小电影在线看 | 成年人免费看 | 久久a久久 | 深夜福利视频在线观看 | 九九视频网站 | 国产精品久久久久影院 | 国际精品网 | 成人亚洲免费 | 久久精品韩国 | 国产女人40精品一区毛片视频 | 国产精品免费久久久久久久久久中文 | 国产麻豆精品95视频 | 一区二区三区四区五区在线视频 | 在线精品视频在线观看高清 | 亚洲午夜久久久久久久久久久 | 日本精品视频一区二区 | 国产色视频网站 | 天天综合网久久综合网 | 久久久久免费精品国产小说色大师 | 国内精品免费 | 亚洲免费精品一区二区 | 久久成年人 | 日韩av免费一区二区 | 91亚洲国产 | 色婷婷av一区 | 99综合视频 | 久草在在线视频 | a级免费观看 | 免费av大全 | 国产精品久久久一区二区 | 一区二区视频在线播放 | 91网在线| 色综合久久久网 | 久草在线资源视频 | 日韩有码在线播放 | 日韩精品一区二区三区外面 | 丁香电影小说免费视频观看 | 99c视频高清免费观看 | 81国产精品久久久久久久久久 | 欧美在线aaa | 波多野结衣在线观看一区二区三区 | 婷婷综合av | 国产亚洲欧洲 | 丁香婷婷综合五月 | 香蕉视频亚洲 | 国产一级做a爱片久久毛片a | 国产日韩视频在线观看 | 亚洲视频免费在线观看 | 99色国产 | 九九视频免费在线观看 | 91成年视频 | 国产亚洲精品免费 | 国产高清在线a视频大全 | 中文字幕在线乱 | 在线视频福利 | 91精品蜜桃 | 超碰在线观看97 | 亚洲日本在线一区 | 色www.| 国产精品麻豆一区二区三区 | 国产在线永久 | 91精品在线播放 | 精品国产一区二区三区久久久 | 久久天天综合网 | 久久久久久久久久久福利 | 国产精品久久久久久久午夜片 | 狠狠干夜夜 | 人人澡人人干 | a级国产乱理论片在线观看 伊人宗合网 | 久久国产精品色av免费看 | 成人91在线 | 99视频偷窥在线精品国自产拍 | 伊人狠狠操 | 在线观看一级视频 | 亚洲视频在线观看 | 亚洲黄色一级视频 | 精品主播网红福利资源观看 | 亚洲成人精品久久 | 美女网站视频一区 | 波多野结衣精品视频 | 国产黄色av网站 | 中文字幕高清av | 91麻豆精品久久久久久 | 美女视频又黄又免费 | 国产视频手机在线 | 免费看色视频 | 午夜精品久久久久久久爽 | 在线亚洲观看 | 久久激情五月婷婷 | 一区二区丝袜 | ,久久福利影视 | 一区二区三区免费播放 | 国精产品999国精产品岳 | 婷婷综合五月天 | 国产精品一区专区欧美日韩 | 日本久久久久 | 久久av中文字幕片 | 国产成人精品综合 |