ios cocopods 安裝使用及高級教程

CocoaPods簡介

每種語言發展到一個階段,就會出現相應的依賴管理工具,例如Java語言的Maven,nodejs的npm。隨着iOS開發者的增多,業界也出現了爲iOS程序提供依賴管理的工具,它的名字叫作:CocoaPodshttp://cocoapods.org/html

1、安裝java

1.更新gemnode

若是終端gem版本太老可能會有問題,先更新gem:(如今大部分新機都不會有這個問題) ios

  sudo gem update --system
git

2.換源github

gem默認的源是外國的https://rubygems.org/,國內網速太慢,換成淘寶源sql

  gem sources -l                         // 查看當前源npm

  gem sources --remove https://rubygems.org/    // 刪除原有的rubygemsswift

  gem sources -a https://gems.ruby-china.org/
xcode

  gem sources -l // 再次查看當前源有沒有替換成功

 

3.選中xcode

若是安裝有多個版本xcode的朋友,須要切換一個默認的版本

  sudo xcode-select --switch /Applications/Xcode.app

4.安裝cocoapods

mac系統版本若是是10.11之前的,使用一下命令安裝:

sudo gem install cocoapods

若是是10.11之後因爲cocoapods的命令路徑改變了,變成:

sudo gem install -n /usr/local/bin cocoapods

5.初始化cocopods

安裝好cocopods之後,須要下載更新本地的依賴庫tree,天天不少人都會更新或建立好的Pods庫,須要下載或更新到本地,因爲依賴庫tree數量太多,可能會很慢,耐心等待,中間可能出現各類莫名其妙的錯誤,很大一部分是網絡緣由,請從新執行命令

pod setuppod setup

2、項目集成cocopods

1.進入到項目的根目錄,建立Podfile文件,

cd  ***/IOSHelloWorldProject        // 進入項目根目錄

touch Podfile                              // 建立Podfile文件

2.用記事本或xcode打開Podfile文件,添加項目所須要的依賴庫,例如:

platform :ios, '8.0'
inhibit_all_warnings!

pod 'AFNetworking'

pod 'SDWebImage'

這樣一個AFNetworking、SDWebImage的依賴庫就添加完成了

3.安裝依賴庫,返回終端執行:

pod install --no-repo-update

4.安裝完成之後咱們不在打開後綴爲.xcodeproj的工程,而是打開後綴爲.xcworkspace的工做空間。

此時一個簡單的cocopods工程就完成了,相信能夠知足大部分小朋友的需求了,對於項目比較複雜、架構設計要求高、個性化追求高的小朋友請接着看cocopods的高級教程

5.cocopods升級

pod --version   // 查看cocopods當前的版本

 

gem update cocoapod // 升級cocopods命令

6.cocopods卸載

電腦重裝或者切換到某個帳號後cocopods使用有問題或者cocopods出現解決不了的問題而必須卸載重裝,下面就是卸載了:

which pod // 查看pod的安裝路徑

gem list --local | grep cocoapods   // 查看當前安裝了哪些有關cocopods的東西

 

xiaomingdeMacBook-Pro:OCServiceDemo xiaoming$ gem list --local | grep cocoapods
cocoapods (1.1.1)
cocoapods-core (1.1.1)
cocoapods-deintegrate (1.0.1, 1.0.0.beta.1)
cocoapods-downloader (1.1.2, 1.1.1, 1.0.0.beta.3, 0.9.3)
cocoapods-plugins (1.0.0, 1.0.0.beta.1, 0.4.2)
cocoapods-search (1.0.0, 1.0.0.beta.2, 0.1.0)
cocoapods-stats (1.0.0, 1.0.0.beta.4, 0.6.2)
cocoapods-trunk (1.1.1, 1.0.0, 1.0.0.beta.3, 0.6.4)
cocoapods-try (1.1.0, 1.0.0.beta.3, 0.5.1)

 

接下來一個一個卸載:

sudo gem uninstall cocoapods-core

sudo gem uninstall cocoapods-deintegrate

若是須要卸載那個版本,以下:

sudo gem uninstall cocoapods -v 1.1.1 //後面的版本號要和上面列表中的版本號對應

 

 

 

2、cocopods高級教程

1.相似pod 'AFNetworking'依賴庫名如何得來,使用pod的搜索命令:

pod search AFNetworking

xiaomingMacBook-Pro:OCServiceDemo xiaoming$ pod search AFNetworking

-> AFNetworking (3.1.0)
   A delightful iOS and OS X networking framework.
   pod 'AFNetworking', '~> 3.1.0'
   - Homepage: https://github.com/AFNetworking/AFNetworking
   - Source:   https://github.com/AFNetworking/AFNetworking.git
   - Versions: 3.1.0, 3.0.4, 3.0.3, 3.0.2, 3.0.1, 3.0.0, 3.0.0-beta.3, 3.0.0-beta.2, 3.0.0-beta.1, 2.6.3, 2.6.2, 2.6.1, 2.6.0, 2.5.4, 2.5.3, 2.5.2,
   2.5.1, 2.5.0, 2.4.1, 2.4.0, 2.3.1, 2.3.0, 2.2.4, 2.2.3, 2.2.2, 2.2.1, 2.2.0, 2.1.0, 2.0.3, 2.0.2, 2.0.1, 2.0.0, 2.0.0-RC3, 2.0.0-RC2, 2.0.0-RC1,
   1.3.4, 1.3.3, 1.3.2, 1.3.1, 1.3.0, 1.2.1, 1.2.0, 1.1.0, 1.0.1, 1.0, 1.0RC3, 1.0RC2, 1.0RC1, 0.10.1, 0.10.0, 0.9.2, 0.9.1, 0.9.0, 0.7.0, 0.5.1
   [master repo]
   - Subspecs:
     - AFNetworking/Serialization (3.1.0)
     - AFNetworking/Security (3.1.0)
     - AFNetworking/Reachability (3.1.0)
     - AFNetworking/NSURLSession (3.1.0)
     - AFNetworking/UIKit (3.1.0)
-> AFNetworking+AutoRetry (0.0.5) Auto Retries for AFNetworking requests pod 'AFNetworking+AutoRetry', '~> 0.0.5' - Homepage: https://github.com/shaioz/AFNetworking-AutoRetry - Source: https://github.com/shaioz/AFNetworking-AutoRetry.git - Versions: 0.0.5, 0.0.4, 0.0.3, 0.0.2, 0.0.1 [master repo] -> AFNetworking+Ext (1.2.1) AFNetworking的封裝, 並提供一個 UIImageView+DYLoading cache in fileSystem+memory pod 'AFNetworking+Ext', '~> 1.2.1' - Homepage: https://github.com/junhaiyang/AFNetworkingExt - Source: https://github.com/junhaiyang/AFNetworkingExt.git - Versions: 1.2.1, 1.2, 1.1, 1.0, 0.5, 0.4, 0.3 [master repo] - Subspecs: - AFNetworking+Ext/Base (1.2.1) - AFNetworking+Ext/AFCustomRequestOperation (1.2.1) - AFNetworking+Ext/AFDownloadRequestOperation (1.2.1) - AFNetworking+Ext/AFTextResponseSerializer (1.2.1) - AFNetworking+Ext/example (1.2.1) - AFNetworking+Ext/UIKit (1.2.1) - AFNetworking+Ext/UIKit/UIImageView+DYLoading (1.2.1) :

解釋下內容:

-> AFNetworking (3.1.0)        // 依賴庫名、最新版本號
   A delightful iOS and OS X networking framework.    // 簡介描述
   pod 'AFNetworking', '~> 3.1.0'                             // 在Podfile文件裏引用這個依賴庫的語法,大部分狀況下拷貝這行到Podfile文件便可
   - Homepage: https://github.com/AFNetworking/AFNetworking   // 依賴庫的主頁,主頁裏包含介紹、說明、源碼等一系列文件
   - Source:   https://github.com/AFNetworking/AFNetworking.git   // 依賴庫的git倉庫路徑
   - Versions: 3.1.0, 3.0.4, 3.0.3, 3.0.2, 3.0.1, 3.0.0, 3.0.0-beta.3, 3.0.0-beta.2, 3.0.0-beta.1, 2.6.3, 2.6.2, 2.6.1, 2.6.0, 2.5.4, 2.5.3, 2.5.2,
   2.5.1, 2.5.0, 2.4.1, 2.4.0, 2.3.1, 2.3.0, 2.2.4, 2.2.3, 2.2.2, 2.2.1, 2.2.0, 2.1.0, 2.0.3, 2.0.2, 2.0.1, 2.0.0, 2.0.0-RC3, 2.0.0-RC2, 2.0.0-RC1,
   1.3.4, 1.3.3, 1.3.2, 1.3.1, 1.3.0, 1.2.1, 1.2.0, 1.1.0, 1.0.1, 1.0, 1.0RC3, 1.0RC2, 1.0RC1, 0.10.1, 0.10.0, 0.9.2, 0.9.1, 0.9.0, 0.7.0, 0.5.1    // 依賴庫的各個版本
   [master repo]
   - Subspecs:   // 這裏的是依賴庫的各個子模塊,通常不用關心,研究依賴庫源碼框架的能夠看看
     - AFNetworking/Serialization (3.1.0)
     - AFNetworking/Security (3.1.0)
     - AFNetworking/Reachability (3.1.0)
     - AFNetworking/NSURLSession (3.1.0)
     - AFNetworking/UIKit (3.1.0)


在Podfile文件使用以下語法引用依賴庫:

pod 'AFNetworking'      //不顯式指定依賴庫版本,表示每次都獲取最新版本
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', '~> 0.1.2'     //使用大於等於0.1.2但小於0.2的版本,不包含0.1.2
pod 'AFNetworking', '~>0.1'     //使用大於等於0.1但小於1.0的版本
pod 'AFNetworking', '~>0'     //高於0的版本,寫這個限制和什麼都不寫是一個效果,都表示使用最新版本

 2.多個target使用相同Pod依賴庫

若是爲IOSHelloWorldProject的targetOne和targetTwo都須要引用Reachability、SBJson、AFNetworking三個Pods依賴庫,可使用link_with關鍵字來實現,將Podfile寫成以下方式:

    link_with 'targetOne', 'targetTwo'
      pod 'Reachability',  '~> 3.0.0'
      pod 'SBJson', '~> 4.0.0'
      pod 'AFNetworking', '~> 2.0'

 新的語法是使用abstract_target

# There are no targets called "Shows" in any Xcode projects
abstract_target 'Shows' do
  pod 'ShowsKit'
  # Has its own copy of ShowsKit + ShowWebAuth
  target 'ShowsiOS' do
    pod 'ShowWebAuth'
  end

  # Has its own copy of ShowsKit + ShowTVAuth
  target 'ShowsTV' do
    pod 'ShowTVAuth'
  end
end

若是使用隱式abstract_target語法必須寫在Podfile文件頂部:

pod 'ShowsKit'
# Has its own copy of ShowsKit + ShowWebAuth
target 'ShowsiOS' do
  pod 'ShowWebAuth'
end

# Has its own copy of ShowsKit + ShowTVAuth
target 'ShowsTV' do
  pod 'ShowTVAuth'
end

 

3.不一樣target引用不一樣Pod依賴

若是爲IOSHelloWorldProject的targetOne引用Reachability,而targetTow引用SBJson、AFNetworking,將Podfile寫成以下方式:

target :'targetOne' do
      pod 'Reachability',  '~> 3.0.0'
  end

    target :'targetTow' do
     pod 'AFNetworking', '~> 2.0'
    pod 'SBJson', '~> 4.0.0'
  
end

 

do/end做爲開始和結束標識符

4.其餘經常使用pod引用依賴庫語法

pod 'Alamofire', :path => '~/Documents/Alamofire' // 在~/Documents/Alamofire路徑下存在spec的項目(spec後期介紹) pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git' // git上的master分支 pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :tag => '3.1.1' // git上tag爲3.1.1 pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :commit => '0f506b1c45' // git上commit爲0f506b1c45 pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :branch => 'dev' // git上的開發分支 ~/Documents/Alamofirespec3.1.1// git上commit爲0f506b1c450f506b1c45

更多Podfile語法請參考官網:https://guides.cocoapods.org/syntax/podfile.html#podfile

5.關於Podfile.lock文件

在使用CocoaPods,執行完pod install以後,會生成一個Podfile.lock文件。這個文件看起來跟咱們關係不大,實際上絕對不該該忽略它。
該文件用於保存已經安裝的Pods依賴庫的版本

Podfile.lock文件最大得用處在於多人開發。當團隊中的某我的執行完pod install命令後,生成的Podfile.lock文件就記錄下了當時最新Pods依賴庫的版本,這時團隊中的其它人check下來這份包含Podfile.lock文件的工程之後,再去執行pod install命令時,獲取下來的Pods依賴庫的版本就和最開始用戶獲取到的版本一致。若是沒有Podfile.lock文件,後續全部用戶執行pod install命令都會獲取最新版本的SBJson,這就有可能形成同一個團隊使用的依賴庫版本不一致,這對團隊協做來講絕對是個災難!
在這種狀況下,若是團隊想使用當前最新版本的SBJson依賴庫,有兩種方案:

  1. 更改Podfile,使其指向最新版本的SBJson依賴庫;
  2. 執行pod update命令;

鑑於Podfile.lock文件對團隊協做如此重要,咱們須要將它添加到版本管理中

5.查看本地依賴庫的tree文件

cocopods的tree文件默認是隱藏的,先把Mac隱藏文件夾顯示出來,Mac隱藏和顯示的命令以下:
隱藏:defaults write com.apple.finder AppleShowAllFiles -bool true
顯示:defaults write com.apple.finder AppleShowAllFiles -bool false
而後退出終端,重啓Finder

cocopods的tree文件的默認路勁是

~/.cocoapods/repos/master/Specs  // 當前用戶的.cocoapods/repos/master/Specs目錄下

直接使用命令以下命令打開路勁便可:

open ~/.cocoapods/repos/master/Specs

 

 

常見問題:

1.若是pod install 出現報錯:



解決方案:
下降一個版本試下:
[!] Unable to find host target(s) for StaticLib. Please add the host targets for the embedded targets to the Podfile. Certain kinds of targets require a host target. A host target is a "parent" target which embeds a "child" target. These are example types of targets that need a host target: - Framework - App Extension - Watch OS 1 Extension - Messages Extension (except when used with a Messages Application)pod _1.1.1_ install

Xcode 9之後若是使用了cocopods後icon沒法顯示,Podfile文件底部添加:
post_install do |installer|
copy_pods_resources_path = "Pods/Target Support Files/Pods-FuelCardApp/Pods-FuelCardApp-resources.sh"
string_to_replace = '--compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"'
assets_compile_with_app_icon_arguments = '--compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${BUILD_DIR}/assetcatalog_generated_info.plist"'
text = File.read(copy_pods_resources_path)
new_contents = text.gsub(string_to_replace, assets_compile_with_app_icon_arguments)
File.open(copy_pods_resources_path, "w" ) {|file| file.puts new_contents }
end
相關文章
相關標籤/搜索