CocoaPods工作原理及使用中遇到的問(wèn)題

項(xiàng)目上線识窿,終于又有時(shí)間研究些三方的東西了,在自己鉆牛角的時(shí)候脑融,不覺(jué)間陷入了誤區(qū)喻频。在項(xiàng)目實(shí)踐過(guò)程中,跟老大也學(xué)到了很多肘迎,也感覺(jué)自己肚子有了些油水甥温,可看到GitHub上那些大牛的開(kāi)源大作,不免自卑妓布。雖入行一年姻蚓,承蒙老大看得起,交給了個(gè)帶徒弟的任務(wù)匣沼,交流中受虐與進(jìn)步同行狰挡,苦澀與暖心并進(jìn)。雖然自己師范出身释涛,可離合格的老師圆兵,真心還是有差距的,至少隊(duì)友給的反饋是:“表達(dá)能力太差枢贿,永遠(yuǎn)活在自己的思路里”。突然想到了小岳岳一句話:“雖然每天工作很累刀脏,但是我掙得少熬旨浴!”愈污,我要說(shuō)的是:“你每天那么努力耀态,忍受了那么多寂寞和痛苦,可我也沒(méi)見(jiàn)你多么優(yōu)秀霸荼ⅰ首装!”,哥懂的還是太少杭跪。好了仙逻,下面是正題:

在項(xiàng)目引入第三方SDK過(guò)程中,各種引入庫(kù)文件涧尿、各種改配置系奉,特別是更新SDK的時(shí)候,著實(shí)是件讓人頭大的事情姑廉。常在網(wǎng)上看到別人使用自動(dòng)化三方庫(kù)管理工具Cocoapods缺亮,原項(xiàng)目中一直沒(méi)敢嘗試,最近一直在研究桥言,使用中確有眼前一亮的感覺(jué)萌踱,不過(guò)中間也遇到了許多問(wèn)題葵礼,賣(mài)弄如下:

安裝流程步驟此處就不多講了,網(wǎng)上隨便搜下......


  • 在使用pod 命令引入文件并鸵,在終端中會(huì)提示:
    Analyzing dependencies
    Downloading dependencies
    Installing......
    Generating Pods project
    [!] From now on use ProjectName.xcworkspace.

如果使用CocoaPods組織管理三方庫(kù)之后鸳粉,就只能通過(guò)ProjectName.xcworkspace打開(kāi),如果打開(kāi)原來(lái)的工程會(huì)編譯報(bào)錯(cuò)能真。
執(zhí)行pod命令之后赁严,項(xiàng)目中會(huì)生成:ProjectName.xcworkspace、Podfile.lock粉铐、Pods等文件疼约;



CocoaPods工作原理:

CocoaPods的工作主要是通過(guò)ProjectName.xcworkspace來(lái)組織的,在打開(kāi)ProjectName.xcworkspace文件后蝙泼,發(fā)現(xiàn)Xcode會(huì)多出一個(gè)Pods工程程剥。

  1. 庫(kù)文件引入及配置:
    庫(kù)文件的引入主要由Pods工程中的Pods-ProjectName-frameworks.sh腳本負(fù)責(zé),在每次編譯的時(shí)候汤踏,該腳本會(huì)幫你把預(yù)引入的所有三方庫(kù)文件打包的成ProjectName.a靜態(tài)庫(kù)文件织鲸,放在我們?cè)璛code工程中Framework文件夾下,供工程使用溪胶。
    如果Podfile使用了use_frameworks!,這是生成的是.framework的動(dòng)態(tài)庫(kù)文件搂擦。引入方式也略有不同。

  2. Resource文件:
    Resource資源文件主要由Pods工程中的Pods-ProjectName-resources.sh腳本負(fù)責(zé)哗脖,在每次編譯的時(shí)候瀑踢,該腳本會(huì)幫你將所有三方庫(kù)的Resource文件copy到目標(biāo)目錄中。

  3. 依賴(lài)參數(shù)設(shè)置:
    在Pods工程中的的每個(gè)庫(kù)文件都有一個(gè)相應(yīng)的SDKName.xcconfig才避,在編譯時(shí)橱夭,CocoaPods就是通過(guò)這些文件來(lái)設(shè)置所有的依賴(lài)參數(shù)的,編譯后桑逝,在主工程的Pods文件夾下會(huì)生成兩個(gè)配置文件棘劣,Pods-ProjectName.debug.xcconfigPods-ProjectName.release.xcconfig楞遏。

使用中遇到的問(wèn)題:


1. install和update命令的配置速度問(wèn)題

在我們輸入pod install或者pod update之后茬暇,CocoaPods首先會(huì)去匹配本地的spec庫(kù),在確認(rèn)spec版本庫(kù)不需要更新之后橱健,才會(huì)下載相應(yīng)的庫(kù)文件而钞,這樣比較耗時(shí),有時(shí)候拘荡,以為是卡死了呢臼节。所以一般使用下面兩個(gè)命令,跳過(guò)spec版本庫(kù)更新匹配。

pod update --verbose --no-repo-update
pod install --verbose --no-repo-update

有朋友說(shuō)不加--verbose网缝,其實(shí)加--verbose的意義在于可以輸出更詳細(xì)的配置過(guò)程 debug信息巨税,在書(shū)寫(xiě)時(shí)位置也可以換,跳過(guò)spec版本庫(kù)更新匹配的重點(diǎn)是--no-repo-update粉臊,比如:

pod install --no-repo-update --verbose // 不更新草添,并打印出詳細(xì)過(guò)程信息
2. The dependency **** is not used in any concrete target.

[!] The dependency UMengAnalytics-NO-IDFA is not used in any concrete target.
這個(gè)提示是因?yàn)椋琧ocoapods升級(jí)為1.0以后扼仲,Podfile文件書(shū)寫(xiě)格式的問(wèn)題远寸,
1.0之前:

   platform :ios
   pod 'UMengAnalytics-NO-IDFA’
   pod 'MBProgressHUD', '~> 0.9.2'
   pod 'FMDB'
   pod 'SDWebImage', '~> 3.7.3'
   pod 'IQKeyboardManager', '~> 3.2.4'
   pod 'MJRefresh', '~> 2.3.2'
   pod 'MJExtension', '~> 0.2.0'

1.0之后:

   platform :ios,’7.0’
   target ‘ProjectName’ do #ProjectName工程名字
   pod 'MBProgressHUD', '~> 0.9.2'
   pod 'FMDB'
   pod 'SDWebImage', '~> 3.7.3'
   pod 'IQKeyboardManager', '~> 3.2.4'
   pod 'MJRefresh', '~> 2.3.2'
   pod 'MJExtension', '~> 0.2.0'
   pod 'UMengAnalytics-NO-IDFA’
   end

?波浪線**~ > ** 含義:從指定版本到倒數(shù)第二位版本號(hào)升1為止,比如 ‘~> 0.3.7’所指的版本區(qū)間為[0.3.7, 0.4.0)屠凶,即>=版本0.3.7驰后,<版本0.4.0,詳見(jiàn)guides.cocoapods.org

3. Unable to satisfy the following requirements: - *** required by Podfile

這種提示主要是因?yàn)橐砑拥念?lèi)庫(kù)有最新版本矗愧,而你本地local specs repositories并沒(méi)有更新其下載版本導(dǎo)致灶芝。
比如 Unable to satisfy the following requirements: - SDWebImage (~> 3.8) required by Podfile
處理方式有兩種:
1、pod update更新本地庫(kù)
2唉韭、降低Podfile文件中的版本夜涕;

4. 使用CocoaPods之后,頭文件無(wú)法自動(dòng)補(bǔ)齊問(wèn)題

使用CocoaPods來(lái)管理三方庫(kù)属愤,還是比較方便的女器,但是突然發(fā)現(xiàn)一個(gè)美中不足的小問(wèn)題,在使用import引入文件時(shí)住诸,不能自動(dòng)補(bǔ)齊晓避,需要手工copy文件名,糾結(jié)了半天:
解決辦法:
Target -> Build Settings 只壳,User Header Search Paths條目中,添加${SRCROOT}或者$(PODS_ROOT)暑塑,并且選擇Recursive吼句,遞歸搜索,然后就可以自動(dòng)補(bǔ)齊了事格。

5. 在項(xiàng)目中移除CocoaPods三方庫(kù)配置文件

如果我們?cè)谂渲肅ocoaPods的三方庫(kù)文件后惕艳,不在需要了可以移除指定庫(kù)文件配置,具體步驟如下:

  • 刪除工程文件夾下的Podfile驹愚、Podfile.lock和Pods文件夾远搪;

  • 刪除xcworkspace文件;

  • 打開(kāi)xcodeproj文件逢捺,刪除項(xiàng)目中的libpods.a和Pods.xcconfig引用谁鳍;

  • 打開(kāi)Build Phases選項(xiàng),刪除Check Pods Manifest.lock和Copy Pods Resources;

  • 重新pod install
  • 如果不想使用pod了倘潜,可以使用 pod deintegrate绷柒,移除三方庫(kù),手動(dòng)添加涮因。

6. Pods written in Swift can only be integrated as frameworks; add use_frameworks! to your Podfile or target to opt into using it.

這種提示废睦,主要是因?yàn)橐砑拥倪@個(gè)庫(kù)有專(zhuān)有swift庫(kù),或者demo中有swift代碼养泡。
解決辦法:在Podfile文件的target后面添加use_frameworks!,注意嗜湃,這里有!。
比如[!] Pods written in Swift can only be integrated as frameworks; add `use_frameworks!` to your Podfile or target to opt into using it. The Swift Pods being used are: ReactiveCocoa, ReactiveSwift, and Result

7. The XXXX [Debug] target overrides the HEADER_SEARCH_PATHS build setting defined in `Pods/Target Support Files/Pods-XXXX/Pods-XXXX.debug.xcconfig'. This can lead to problems with the CocoaPods installation

或者
The XXXX [Debug] target overrides the OTHER_LDFLAGS build setting defined in `Pods/Target Support Files/Pods-XXXX/Pods-XXXX.debug.xcconfig'. This can lead to problems with the CocoaPods installation

參考:the-target-overrides
解決方法:

  • Go to your target Build Settings -> Other linker flags -> double click . Add $(inherited) to a new line.

  • All these 3 errors would be gone by adding $(inherited) to

Header Search Paths
Other Linker Flags
Preprocessor Macros
in Project -> Target -> Build Settings
重新pod
pod install

再或者
The XX [Debug] target overrides the ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES build setting defined in `Pods/Target Support Files/Pods-XX/Pods-XX.debug.xcconfig'. This can lead to problems with the CocoaPods installation

解決方法:
在build setting 搜索ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES澜掩,選擇該條目购披,按delete鍵。

8. Xcode10版本工程cocoapod <=1.5.3問(wèn)題

RuntimeError - [!] Xcodeproj doesn't know about the following attributes {"inputFileListPaths"=>[], "outputFileListPaths"=>[]} for the 'PBXShellScriptBuildPhase' isa.

RuntimeError - [!] Xcodeproj doesn't know about the following attributes {"inputFileListPaths"=>[], "outputFileListPaths"=>[]} for the 'PBXShellScriptBuildPhase' isa.

參考:RuntimeError - [!] Xcodeproj doesn't know about the following
解決辦法:
This is a known bug introduced by Xcode 10 which fixed in CocoaPods 1.6.0. Right now (Sep 2018) it's in beta, so you can install it with

sudo gem install cocoapods --pre
或者
sudo gem install -n /usr/local/bin cocoapods --pre

Alternative solution for CocoaPods 1.5.3 could be found here.

9. Errno::EPERM - Operation not permitted @ chmod_internal
Errno::EPERM - Operation not permitted @ chmod_internal - /Users/admin/Desktop/SoamBaMeng/Pods/AFNetworking/AFNetworking/AFHTTPSessionManager.m
/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/fileutils.rb:1346:in `chmod'
/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/fileutils.rb:1346:in `chmod'
/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/fileutils.rb:1001:in `block in chmod'
/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/fileutils.rb:1000:in `each'
/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/fileutils.rb:1000:in `chmod'

這個(gè)問(wèn)題為文件訪問(wèn)權(quán)限問(wèn)題
解決辦法:

移除Pods文件夾输硝,重新pod install
10. error: RPC failed fatal: early EOF
......
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
fatal: The remote end hung up unexpectedly 
fatal: early EOF 
fatal: index-pack failed

解決辦法

admin:~ admin$ git config --global http.postBuffer 24288000
admin:~ admin$ git config --list
credential.helper=osxkeychain
http.postbuffer=24288000
11.Please contact the author or set the SWIFT_VERSION attribute in at least one of the targets that integrate this pod.
例如:
- `ChartsRealm` does not specify a Swift version and none of the targets (`Ates`) integrating it have the `SWIFT_VERSION` attribute set. Please contact the author or set the `SWIFT_VERSION` attribute in at least one of the targets that integrate this pod.
- `RealmSwift` does not specify a Swift version and none of the targets (`Ates`) integrating it have the `SWIFT_VERSION` attribute set. Please contact the author or set the `SWIFT_VERSION` attribute in at least one of the targets that integrate this pod.

解決辦法今瀑,如果是純OC工程,請(qǐng)嘗試新建一個(gè)Swift類(lèi)点把,生成橋接文件橘荠,然后,選中對(duì)應(yīng)的target郎逃,--> build setting --> Swift Compiler Language --> Swift Language Version哥童,選擇一個(gè)Swift版本。

本文已在版權(quán)印備案褒翰,如需轉(zhuǎn)載請(qǐng)?jiān)诎鏅?quán)印獲取授權(quán)贮懈。
獲取版權(quán)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市优训,隨后出現(xiàn)的幾起案子朵你,更是在濱河造成了極大的恐慌,老刑警劉巖揣非,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抡医,死亡現(xiàn)場(chǎng)離奇詭異早敬,居然都是意外死亡忌傻,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)水孩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人琐驴,你說(shuō)我怎么就攤上這事俘种〕颖辏” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵安疗,是天一觀的道長(zhǎng)抛杨。 經(jīng)常有香客問(wèn)我,道長(zhǎng)荐类,這世上最難降的妖魔是什么怖现? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮玉罐,結(jié)果婚禮上屈嗤,老公的妹妹穿的比我還像新娘。我一直安慰自己吊输,他們只是感情好饶号,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著季蚂,像睡著了一般茫船。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扭屁,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天算谈,我揣著相機(jī)與錄音,去河邊找鬼料滥。 笑死然眼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的葵腹。 我是一名探鬼主播高每,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼践宴!你這毒婦竟也來(lái)了鲸匿?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤阻肩,失蹤者是張志新(化名)和其女友劉穎晒骇,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體磺浙,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年徒坡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了撕氧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡喇完,死狀恐怖伦泥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤不脯,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布府怯,位于F島的核電站,受9級(jí)特大地震影響防楷,放射性物質(zhì)發(fā)生泄漏牺丙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一复局、第九天 我趴在偏房一處隱蔽的房頂上張望冲簿。 院中可真熱鬧,春花似錦亿昏、人聲如沸峦剔。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吝沫。三九已至,卻和暖如春递礼,著一層夾襖步出監(jiān)牢的瞬間惨险,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工宰衙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留平道,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓供炼,卻偏偏與公主長(zhǎng)得像一屋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子袋哼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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