通過這個教程,你會學習使用一個很流行的第三方開源組件管理工具----CocoaPods。不過這個工具是什麼,爲什麼要使用它呢?
作爲一個iOS開發者,你一定會用到很多別人的代碼,這些代碼以類庫的形式提供。想象一下,如果所有的東西都要你從零開始創建,得有多麻煩!
如果沒有管理工具,你可能會簡單地將每個組件加入到你的工程中。但是,這麼做有一些弊端:
1. 組件代碼保存在你的工程中,浪費空間。
2. 沒有一個集中的能看到所有可用組件的地方。
3. 查找和升級組件很困難,尤其是有多個組件需要升級。
4. 在你的工程中下載然後引入組件可能存在這樣的風險:修改其代碼,然後擱置一邊。從而導致下次升級時更加麻煩。
一個第三方組件管理工具可以幫助你克服這些問題。它能自動獲取組件的源代碼,解決類庫之間的依賴,甚至可以創建並維護一個正常的環境來創建你的項目。
在本教程中,你會學習如何使用CocoaPods。特別的是,你會使用多個開源組件來創建一個app,它可以獲取並展示來自 trakt.tv 的電視及電影信息。CocoaPods讓這個過程變得非常簡單。接着往下看!
準備開始
開始之前:該教程需要你熟悉Xcode,命令行工具,瞭解ASIHTTPRequest組件、JSON格式。如果你對這些都不熟悉,先看看 其他教程 。
PS: 原文中的示例太複雜,和CocoaPods關係不大,因此我強行替換成一個使用ASIHTTPRequest查詢天氣的示例demo 。
CocoaPods官網 說,它是Objective-C工程下最好的管理類庫依賴的工具,這麼說確實不假!與其自己從GitHub下載代碼然後複製到你的工程中,導致將來升級很困難,CocoaPods可以幫你做這些事。
下面,你需要安裝CocoaPods。它在Ruby下運行,不過這是它唯一的限制。幸運的是,最近版本的Mac OSX系統(從OS X10.7Lion開始)都已經預裝了Ruby。所以你只需要更新RubyGems到最新版本。
打開終端,然後輸入如下的命令:
sudo gem update --system
按提示輸入密碼,
要注意在終端中密碼不顯示字符,只要輸完後按回車即可
。終端中輸入看起來應該是這樣的:
更新會花費一點時間,耐心等待幾分鐘。
然後,你需要安裝CocoaPods。在終端中輸入如下命令:
sudo gem install cocoapods
如果安裝過程中遇到以下提示,輸入y繼續。
rake's executable "rake" conflicts with /usr/bin/rake Overwrite the executable? [yN]
最後,在終端中輸入如下命令來完成安裝:
pod setup這條命令,將 CocoaPods Specs repository
複製到你電腦上的~/.cocoapods目錄下,它需要一點時間來完成。
到這裏,你已經成功安裝了CocoaPods!
PS:從這裏開始,不使用原文demo,自己創建一個新工程 。
打開Xcode,創建一個新的singleView工程,然後關掉Xcode,是的關掉它。現在該創建你的podfile了。
安裝你的第一個第三方組件
打開終端,並定位到剛剛創建的工程目錄下:
cd ~/Path/To/Folder/Containing/PodDemo
然後輸入命令:
pod init
這條命令會在你的工程下創建一個默認的Podfile。你將在Podfile裏定義所用到的組件。
輸入下面的命令,用Xcode打開Podfile:
open -a Xcode Podfile
默認的Podfile看起來像這樣:
# Uncomment this line to define a global platform for your project # platform :ios, "6.0" target "PodDemo" do end
將# platform:ios, "6.0"替換成,告訴CocoaPods你的工程是運行在iOS7下:
platform :ios, "7.0"
很多類庫都有最低的iOS版本要求。如果你省略了這一行,CocoaPods會給一個默認的iOS版本(目前是iOS4.3)。
現在終於可以用CocoaPods加入你的第一個組件了。在Podfile中,target "PodDemo" do下面加上:
pod 'ASIHTTPRequest', '1.8.2'
這句話告訴CocoaPods你想要在工程中引入ASIHTTPRequest Version 1.8.2。
如果你想要使用更復雜的操作,請看 更多Podfile語法 。
保存並關閉Podfile。
現在告訴CocoaPods去安裝這些組件到你的工程中。在終端中輸入(確保在項目目錄下):
pod install
你會看到如下的輸出:
Analyzing dependencies Downloading dependencies Using ASIHTTPRequest (1.8.2) Using Reachability (3.1.1) Generating Pods project Integrating client project
可能還會有:
[!] From now on use `ShowTracker.xcworkspace`.
此時CocoaPods在項目目錄下創建了一個Pods文件夾----用於存放所有的第三方組件,以及PodDemo.xcworkspace。
正如上面的警告提醒,從現在開始,你必須使用PodDemo.xcworkspace來打開該項目。
如果Xcode項目還打開着,關掉它,打開PodDemo.xcworkspace。
測試ASIHTTPRequest
1.在ViewController.h中導入ASIHTTPRequest頭文件:
#import <ASIHTTPRequest/ASIFormDataRequest.h>
2.給ViewController.h添加一個ASIFormDataRequest屬性:
@property (nonatomic,strong)ASIFormDataRequest *request;
3.修改ViewController.m的ViewDidLoad方法:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSURL *url = [NSURL URLWithString:@"http://www.weather.com.cn/data/sk/101010100.html"];
self.request = [[ASIFormDataRequest alloc] initWithURL:url];
self.request.requestMethod = @"GET";
self.request.delegate = self;
[self.request startAsynchronous];
}
4.在ViewController.m中添加ASIHTTPRequest代理方法:
- (void)requestFinished:(ASIHTTPRequest *)request { NSArray *result = [NSJSONSerialization JSONObjectWithData:request.responseData options:NSJSONReadingMutableContainers error:nil]; NSLog(@"%@",result); }
運行代碼,看到Console輸入如下:
2014-10-15 14:08:24.734 PodDemo[7319:120294] { weatherinfo = { Radar = "JC_RADAR_AZ9010_JB"; SD = "16%"; WD = "\U5317\U98ce"; WS = "4\U7ea7"; WSE = 4; city = "\U5317\U4eac"; cityid = 101010100; isRadar = 1; njd = "\U6682\U65e0\U5b9e\U51b5"; qy = 1010; temp = 21; time = "13:55"; }; }
至此,組件已經被成功的引入到你的工程中了!
添加更多Pods
既然你已經知道CocoaPods如何工作,下面只剩下一件事可做:添加更多的Pods!
不過,事實上。。。你應該在工程中引入儘量少的pods。雖然CocoaPods讓升級組件變得更容易,但是你始終要不時地更新你自己的代碼。長遠來看,最好的方式是讓這些組件在你的控制之內。
現在向你的工程添加2個組件。比起從命令行打開Podfile,現在你可以在workspace中找到這個文件並打開。添加:
pod 'SAMCategories', '0.5.2' pod 'Nimbus/AttributedLabel', '1.2.0'
保存,然後安裝引用(在終端中使用pod install)。
你是否注意到Nimbus/AttributedLabel和其他pod不一樣,多了一個"/"?大的pods常常將他們的庫拆分成核心模塊和一些小的子模塊。在這個例子中,“/”表示AttributedLabel是Nimbus的子模塊。
如果你不熟悉這些類庫,這裏有兩個例子:
sstoolk 是一個便捷的工具包,用於解決iOS開發者們經常遇到的問題。
Nimbus ,全稱NimbusKit,是另一個很有用的工具包。
爲了測試一切正常,編譯項目。此時,你會看到有很多警告!
“等等,我還沒有更改項目代碼!”你可能會這麼想。
不管什麼時候,你通過CocoaPods添加一個引用,它的源碼已經被加入到項目中了。當你編譯項目時,它們也會一起被編譯。
所以,如果你加入的引用有很多警告,甚至編譯報錯,很可能它已經不再被維護了。
遇到這種情況,你可以在 CocoaPods website 上查找一個替換的組件。同時你還能找到它們的詳細信息,如網站鏈接,說明文檔,等等。
我們這個實力,大部分的警告都來源於iOS7廢棄了一些方法,你可以安全地無視掉它們。
爲了讓CocoaPods的引入不顯示警告,在Podfile最上方加上:
inhibit_all_warnings!
重新運行pod install,編譯項目,此時你應該看到警告已經不顯示了。
PS: 對Podfile修改安裝之後編譯項目,可能會出現如下警告 :
The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.
此時,正確的做法是:
I. Project Cleanup
- In the project navigator, select your project
- Select your target
- Remove all libPods*.a in Linked Frameworks and Libraries
II. Update CocoaPods
- Launch Terminal and go to your project directory.
- Update CocoaPods using the command
pod install
注意,1.3很重要。
入門教程到此結束。