Cocoapods的安裝及使用

簡介

Cocoapods是OS X和iOS下的一個(gè)第三方庫管理工具儡司,并且支持Objective-C和swifit語言鸟整。通過Cocoapods為項(xiàng)目添加稱為"Pods"的依賴庫(這些庫必須是Cocoapods所支持的)欠窒,并且輕松實(shí)現(xiàn)第三方庫的版本管理。
引入Cocoapods的意義:Cocoapods在引入第三方庫時(shí)自動(dòng)為我們完成各種配置,包括配置編譯階段燕雁、連接器選項(xiàng)诞丽、甚至是ARC環(huán)境下的-fno-objc-arc配置等;Cocoapods可以很方便的查找第三方庫拐格,可以快速方便的尋找到優(yōu)秀的第三方庫以及它們的各種信息僧免。

原理:CocoaPods的原理是將所有的依賴庫都放到另一個(gè)名為Pods的項(xiàng)目中,然后讓主項(xiàng)目依賴Pods項(xiàng)目捏浊,這樣懂衩,源碼管理工作都從主項(xiàng)目移到了Pods項(xiàng)目中。Pods項(xiàng)目最終會(huì)編譯成一個(gè)名為libPods.a的文件金踪,主項(xiàng)目只需要依賴這個(gè).a文件即可浊洞。
Cocoapods 官方網(wǎng)站:https://cocoapods.org/
Cocoapods整個(gè)項(xiàng)目托管在github上, 所有的Pods依賴庫也都依賴github
https://github.com/CocoaPods

一胡岔、 配置Ruby環(huán)境法希,安裝CocoaPods

  • CocoaPods是基于ruby ecosystem的,需要ruby環(huán)境靶瘸,使用ruby的gem命令苫亦。所以我們的系統(tǒng)要有ruby環(huán)境。然而Mac系統(tǒng)默認(rèn)會(huì)安裝好ruby環(huán)境怨咪∥萁#可在終端ruby -v查看ruby版本

  • 打開終端,依次執(zhí)行輸入的部分命令如下:

  • 安裝需要用到Ruby诗眨,雖然Mac自帶了Ruby唉匾,不過版本有點(diǎn)老了,最好更新一下辽话。(測試不更新也是可以的)

//查看ruby版本
ruby -v
//輸出信息
ruby 2.3.3p222 (2016-11-21 revision 56859) [universal.x86_64-darwin17]
命令截圖
  • 打開終端肄鸽,輸入命令!(部分命令如下)
sudo gem update --system      //升級(jí)Ruby環(huán)境*
gem sources -l                               // 查看源列表
gem sources -remove https://rubygems.org/     // 將不需要的源移除掉
gem sources -a https://gems.ruby-china.com/      // 添加ruby-china源源(當(dāng)然你有其他可用的源也可以)
sudo gem install cocoapods           // 安裝cocoapods油啤,需要輸入用戶密碼典徘,輸入完成后,按回車鍵益咬,需要等待許久后才能完成安裝逮诲,成功安裝后會(huì)有提示
pod --version       //查看是否安裝成功,如果成功會(huì)顯示pod的版本
pod setup   //這條命令是將Github上的開源庫https://github.com/CocoaPods/Specs.git托管的Podspec索引文件都下載到本地 幽告,花費(fèi)時(shí)間比較久梅鹦,
pod search AFNetworking    // 搜索AFNetworking庫
sudo gem uninstall cocoapods    //卸載CocoaPods

命令截圖

命令截圖

執(zhí)行pod setup ,這條命令是將Github上的開源庫https://github.com/CocoaPods/Specs.git托管的Podspec索引文件都下載到本地的~/.cocoapods/repos/master/路徑下 冗锁,花費(fèi)時(shí)間比較久齐唆,所以可以選擇直接從別的地方拷貝一份放到對(duì)應(yīng)的目錄下,或者手動(dòng)去Github下載冻河,下載完成后放到對(duì)應(yīng)的目錄下箍邮。

  • 通過如下終端命令下載到對(duì)應(yīng)的位置茉帅,可以看到下載進(jìn)度。
終端命令下載
  • 搜索第三方庫
搜索失敗

搜索第三方庫如果出現(xiàn)了上述錯(cuò)誤锭弊,可以執(zhí)行
rm ~/Library/Caches/CocoaPods/search_index.json來刪除本地舊的search_index.json文件堪澎,

然后再次輸入pod search AFNetworking進(jìn)行搜索,pod search 命令會(huì)先查看有無search_index.json文件味滞,如果不存在該文件樱蛤,會(huì)自動(dòng)根據(jù)master文件夾生成一個(gè)新的search_index.json文件,
這時(shí)會(huì)提示Creating search index for spec repo 'master'..剑鞍,然后就耐心等待吧.......成功了之后就如下圖:

搜索成功會(huì)顯示類庫的信息

二昨凡、安裝成功,使用CocoaPods

在使用CocoaPods之后攒暇,我只需要將用到的第三方開源庫放到一個(gè)名為Podfile的文件中土匀,然后執(zhí)行pod install子房。CocoaPods就會(huì)自動(dòng)將這些第三方開源庫的源碼下載下來形用,并且為我的工程設(shè)置好相應(yīng)的系統(tǒng)依賴和編譯參數(shù)。

  • 使用時(shí)需要新建一個(gè)名為 Podfile 的配置文件证杭,放在主項(xiàng)目的根目錄下(與TestFramework.xcodeproj文件同一層級(jí))田度,以我桌面上的TestFramework工程為例:
示例工程

用終端命令新建Podfile文件到主項(xiàng)目目錄(關(guān)于終端命令的使用可以看看這篇Mac 終端命令大全):

① 、 cd到項(xiàng)目總目錄
cd到項(xiàng)目總目錄
②解愤、 創(chuàng)建Podfile配置文件

接著第①步镇饺,終端先執(zhí)行vim Podfile命令 ,接著在鍵盤端輸入 i送讲,進(jìn)入編輯模式奸笤,輸入如下配置信息(也可以先跳過輸入這一步,之后直接打開Podfile文件編輯):


編輯頁面

編輯相關(guān)介紹
pod 'AFNetworking'//不顯式指定依賴庫版本哼鬓,表示每次都獲取最新版本
pod 'AFNetworking', '~>0' //高于0的版本监右,寫這個(gè)限制和什么都不寫是一個(gè)效果,都表示使用最新版本
pod 'AFNetworking', '~> 0.1.2' //使用大于等于0.1.2但小于0.2的版本
pod 'AFNetworking', '~>0.1'//使用大于等于0.1但小于1.0的版本
pod 'AFNetworking', '2.0'//只使用2.0版本
pod 'AFNetworking', '= 2.0'//只使用2.0版本
pod 'AFNetworking', '> 2.0'//使用高于2.0的版本
pod 'AFNetworking', '>= 2.0'//使用大于或等于2.0的版本
pod 'AFNetworking', '< 2.0'//使用小于2.0的版本
pod 'AFNetworking', '<= 2.0' //使用小于或等于2.0的版本
pod 'AFNetworking', :git => '[http://gitlab.xxxx.com/AFNetworking.git'](https://links.jianshu.com/go?to=http%3A%2F%2Fgitlab.xxxx.com%2FAFNetworking.git%27), :branch => 'R20161010'//指定分支
pod 'AFNetworking', :path => '../AFNetworking'//指定本地庫

然后按Esc异希,并且輸入“ :”號(hào)進(jìn)入vim命令模式健盒,然后輸入wq,回車后就會(huì)發(fā)現(xiàn)TestFramework項(xiàng)目目錄中多一個(gè)Podfile文件称簿。

結(jié)束編輯
生成Podfile文件

命令執(zhí)行完成后扣癣,需要導(dǎo)入的第三方庫都已經(jīng)下載完成并且設(shè)置好了編譯參數(shù)和依賴,同時(shí)你需要注意:

  • 使用 CocoaPods 生成的 CocoapodsDemo.xcworkspace 文件來打開工程憨降,而不是以前的 CocoapodsDemo.xcodeproj 文件父虑;
  • 當(dāng)需要更改Podfile文件配置信息時(shí) ,比如刪除或者增加三方庫 授药,直接編輯Podfile文件士嚎, 每次更改了 Podfile 文件后垂涯,你需要重新執(zhí)行一次pod install命令,別忘了要cd 到Podfile文件所在目錄航邢。
  • 第三方庫們都有人在維護(hù)升級(jí)耕赘,當(dāng)我們需要更新下第三方庫的版本時(shí),就需要終端執(zhí)行命令pod update膳殷。

podfile文件編輯介紹

  1. 添加源方式操骡,任選一,推薦使用清華鏡像源
#####1.沒有私有specs赚窃,使用
source 'https://cdn.cocoapods.org/'
#####2.有私有specs册招,使用 
source 'https://github.com/artsy/Specs.git'
source 'https://cdn.cocoapods.org/'

##舊版CocoaPods不支持CDN,可能拿到的三方框架不是最新的
source 'https://github.com/CocoaPods/Specs.git'

##推薦使用清華大學(xué)鏡像源
source 'https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git'

##忽略.cocoapods中多個(gè)specs源引起的警告問題
install! 'cocoapods', :warn_for_unused_master_specs_repo => false
  1. build configurations (編譯配置) 默認(rèn)情況下勒极,依賴項(xiàng)會(huì)被安裝在所有target的build configrations中是掰。
 //為了調(diào)試或者其他原因,他們可以在給定的configurations中啟用
 pod 'PonyDebugger', :configurations => ['Debug', 'Beta']
 //或者辱匿,你可以至指定一個(gè)build configration
 pod 'PonyDebugger', :configuration => ‘Debug'
  1. source: 默認(rèn)被指定的依賴項(xiàng)會(huì)在全局級(jí)別的指定源中匹配搜索键痛。可以為特依賴關(guān)系指定源
 //指定特定源中搜索匾七,并忽略任何全局源*
 pod 'PonyDebugger', :source => 'https://github.com/CocoaPods/Specs.git'
  1. Subspecs:當(dāng)使用依賴庫名字引入依賴庫時(shí)絮短,也會(huì)默認(rèn)安裝依賴庫中的所有子模塊。
 //指定引用指定子模塊
 pod 'QueryKit/Attribute’
 //指定一個(gè)子模塊集合
 pod 'QueryKit', :subspecs => ['Attribute', 'QuerySet']
  1. pod: 指明項(xiàng)目依賴昨忆,一個(gè)依賴是由一個(gè)pod名稱和一個(gè)可選版本定義
// a. 如果不添加版本號(hào)丁频,pod默認(rèn)使用最新的 如:
pod ’ AFNetworking’

// b. 如果項(xiàng)目需要一個(gè)指定的pod,需要添加版本號(hào)邑贴,如: 
pod ‘objection’, ‘0.9’

// c. 指定版本范圍
pod 'AFNetworking', '=0.1'        //版本是0.1
pod 'AFNetworking', '>0.1`        //任何大于0.1版本
pod 'AFNetworking', '>=0.1`       //0.1和大于0.1版本
pod 'AFNetworking', '<0.1`        //小于0.1版本
pod 'AFNetworking', '<=0.1`       //0.1和小于0.1版本
pod 'AFNetworking', '~=0.1.2`     // 表示是(0.1.2<= pod < 0.2 版本) 席里,安裝這個(gè)范圍內(nèi)最新的版本
  1. podspec : 引用倉庫根目錄的(from a pod spec in the root of a library repository)引用pod在指定節(jié)點(diǎn)或者分支
 //主分支:
 pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git'

 //指定分支: :branch => 'dev'
 pod 'AFNetworking', :git => 'https://github.com/a/AFNetworking.git', :branch => 'dev'

 //指定的tag:  :tag => '0.7.0'
 pod 'AFNetworking', :git => 'https://github.com/b/AFNetworking.git', :tag => '0.7.0'

 //指定的節(jié)點(diǎn): :commit => '082f8319af'
 pod 'AFNetworking', :git => 'https://github.com/c/AFNetworking.git', :commit =>  ‘082f8319af'

添加本地框架

 //添加本地框架  path后面跟本地框架的詳細(xì)路徑
 pod 'TKPermissionKit' , :path => "../"
  1. abstract_target :定義一個(gè)抽象的target,為了方便target目標(biāo)依賴?yán)^承拢驾。這個(gè)target是沒有被定義在xcode中的奖磁。例子:
 // a.定義一個(gè)抽象target
 abstract_target 'Networking' do     
     pod ‘AlamoFire'
     target 'Networking App 1’
     target 'Networking App 2’
 end
 // b. 定義一個(gè)包含多個(gè)target的抽象target
 # 注意:這是個(gè)抽象的target工程中并沒有這個(gè)target.引入ShowsKit 
 abstract_target 'Shows' do 
     pod 'ShowsKit’ 
     # ShowsiOS target會(huì)引入ShowWebAuth庫以及繼承自Shows的ShowsKit庫 
     target 'ShowsiOS' do 
         pod 'ShowWebAuth’ 
     end
     # ShowsTV target會(huì)引入ShowTVAuth庫以及繼承自Shows的ShowsKit庫 
     target 'ShowsTV’ do
         pod ‘ShowTVAuth'
     end 
     # ShowsTests target引入了Specta和Expecta庫,并且指明繼承Shows独旷,所以也會(huì)引入ShowsKit
     target 'ShowsTests’ do
         inherit! :search_paths 
         pod 'Specta’ 
         pod 'Expecta’ 
     end 
 end

  1. script_phase 使用這個(gè)命令給target添加shell腳本
 target ‘A’ do
     script_phase :name => 'HelloWorldScript', :script => 'echo "Hello World”'
     script_phase :name => 'HelloWorldScript', :script => 'puts "Hello World"', :shell_path => '/usr/bin/ruby'
 end

  1. abstract! 指定當(dāng)前target是抽象target
 target ‘A’ do
     abstract!
 end

  1. inherit! 設(shè)置當(dāng)前target的繼承關(guān)系
 target 'App’ do
     target ‘A’ do
         #這個(gè)target 繼承 父級(jí)所有行為
         inherit! :complete  
     end
     target ‘B’ do
         #這個(gè)target 不繼承 父級(jí)所有行為
         inherit! :none 
     end
     target ‘C’ do
         #target 僅繼承 父級(jí)的搜索路勁
         inherit! :search_paths 
     end
 end

③ 署穗、 執(zhí)行 pod install ,生成管理三方庫的Pods工程
下載三方庫
生成CocoapodsDemo.xcworkspace
打開CocoapodsDemo.xcworkspace
關(guān)于 Podfile.lock (引自:唐巧的博客

當(dāng)你執(zhí)行pod install之后嵌洼,除了 Podfile 外案疲,CocoaPods 還會(huì)生成一個(gè)名為Podfile.lock的文件,Podfile.lock 應(yīng)該加入到版本控制里面麻养,不應(yīng)該把這個(gè)文件加入到.gitignore中褐啡。因?yàn)?code>Podfile.lock會(huì)鎖定當(dāng)前各依賴庫的版本,之后如果多次執(zhí)行pod install 不會(huì)更改版本鳖昌,要pod update才會(huì)改Podfile.lock了备畦。這樣多人協(xié)作的時(shí)候低飒,可以防止第三方庫升級(jí)時(shí)造成大家各自的第三方庫版本不一致。

CocoaPods 的這篇 官方文檔 也在What is a Podfile.lock一節(jié)中介紹了Podfile.lock的作用懂盐,并且指出:

This file should always be kept under version control.

三褥赊、使用CocoaPods管理的三方庫

項(xiàng)目截圖

四、回顧幾個(gè)更新第三方庫的常用的命令

更新所有庫最簡單基本的方法:
pod update :

更新本地倉庫:
pod repo update

簡單來說莉恼,這條命名是用來更新本地 CocoaPods 的 spec 資源配置信息拌喉。安裝完 CocoaPods 后,在用戶根目錄下有個(gè)隱藏文件夾~/.cocoapods俐银,里面是 CocoaPods 收錄的所有庫的配置信息尿背。pod repo update實(shí)際是更新整個(gè).cocoapods下的所有庫,其實(shí)我們也可以只更新其中某個(gè)庫來達(dá)到快速可用的目的捶惜。
pod repo update ~/.cocoapods/repos/master/Specs/

更新指定第三方庫最簡單基本的方法:
pod update 庫名

把Podfile內(nèi)全部的庫更新重新安裝:
pod install

只更新新添加的庫田藐,已更新的庫忽略:
pod install --verbose --no-repo-update

只更新指定的庫,其它庫忽略:
pod update 庫名 --verbose --no-repo-update

  • 參數(shù)解釋
  1. 參數(shù) –verbose 和 –silent
    這兩個(gè)參數(shù)是用來控制 pod 命令的吱七,有些人不希望看到輸出的情況下可以選擇 --silent汽久,--verbose 的意思則是輸出詳細(xì)日志信息。
    加 --verbose 的意義在于可以輸出更詳細(xì)的配置過程 debug 信息陪捷,在書寫時(shí)位置也可以換回窘。
  2. 參數(shù) --no-repo-update
    在我們輸入pod install或者pod update之后诺擅,CocoaPods 首先會(huì)去匹配本地的 spec 庫市袖,在確認(rèn) spec 版本庫不需要更新之后,才會(huì)下載相應(yīng)的庫文件烁涌,這樣比較耗時(shí)苍碟。所以一般使用時(shí)會(huì)加上 --no-repo-update,跳過 spec 版本庫更新匹配撮执。
    但是這樣會(huì)有個(gè)問題微峰,如果 github 上 pods 的三方庫有新版本了,你本地搜索到的還是舊版本抒钱,如果用的新版本號(hào)是無法裝配的蜓肆,所以每隔一段時(shí)間最好執(zhí)行一下pod repo update。
    另外首次 install 不應(yīng)該添加這個(gè)標(biāo)志谋币,后續(xù)修改 Podfile 的時(shí)候可以適當(dāng)使用仗扬,加快 pod 速度。

遇到的更新場景

  • 情況一
    Cocoapods 本地 Pod 的索引文件沒有更新蕾额,所以本地庫還是舊版本早芭,自然怎么都無法更新到最新版。
    解決方法
    打開終端诅蝶,查看一下 Cocoapods 的版本號(hào):pod --version
    如果不是最新版本退个,升級(jí)一下 Cocoapods 版本:sudo gem install -n /usr/local/bin cocoapods --pre
    但是有時(shí)候 Cocoapods 升到最新版本后募壕,cd 到工程文件下pod install,發(fā)現(xiàn)還是沒有更新最新的庫语盈。這時(shí)候需要更新本地 Pod 的索引文件:pod setup或pod repo update舱馅。
    此時(shí)再pod install或pod update,應(yīng)該就是最新的了刀荒。
  • 情況二
    因?yàn)楣敬罱俗约旱?GitLab 庫习柠,經(jīng)常發(fā)現(xiàn)pod update下來的還是舊代碼。
    這是由于 Pod 緩存造成的照棋,雖然本地和遠(yuǎn)程 Git 倉庫都是最新版本资溃,但是本地 Pod 緩存中,依舊有舊版的緩存烈炭,執(zhí)行pod update時(shí)溶锭,會(huì)先從本地緩存讀取數(shù)據(jù)。
    解決方法
    cd 到 ~/資源庫/Caches/CocoaPods/Pods/Release/庫名符隙;
    刪除庫名下的文件趴捅,如~/資源庫/Caches/CocoaPods/Pods/Release/庫名/1.0.0-fbd65;
    pod cache clean 庫名霹疫;
    cd 到項(xiàng)目中拱绑,刪除 Pods/庫名,刪除 Podfile.lock丽蝎,再pod update猎拨,代碼更新成功。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屠阻,一起剝皮案震驚了整個(gè)濱河市红省,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌国觉,老刑警劉巖吧恃,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異麻诀,居然都是意外死亡痕寓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門蝇闭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呻率,“玉大人,你說我怎么就攤上這事丁眼】攴铮” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長藐守。 經(jīng)常有香客問我挪丢,道長,這世上最難降的妖魔是什么卢厂? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任乾蓬,我火速辦了婚禮,結(jié)果婚禮上慎恒,老公的妹妹穿的比我還像新娘任内。我一直安慰自己,他們只是感情好融柬,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布死嗦。 她就那樣靜靜地躺著,像睡著了一般粒氧。 火紅的嫁衣襯著肌膚如雪越除。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天外盯,我揣著相機(jī)與錄音摘盆,去河邊找鬼。 笑死饱苟,一個(gè)胖子當(dāng)著我的面吹牛孩擂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播箱熬,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼类垦,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了坦弟?” 一聲冷哼從身側(cè)響起护锤,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎酿傍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驱入,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赤炒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了亏较。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片莺褒。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖雪情,靈堂內(nèi)的尸體忽然破棺而出遵岩,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布尘执,位于F島的核電站舍哄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏誊锭。R本人自食惡果不足惜表悬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丧靡。 院中可真熱鬧蟆沫,春花似錦、人聲如沸温治。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熬荆。三九已至但绕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惶看,已是汗流浹背捏顺。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纬黎,地道東北人幅骄。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像本今,于是被迫代替她去往敵國和親拆座。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容