文章目錄
- 安裝RubyGems
- 安裝command line工具
- 安裝CocoaPods
http://ijavascripter.com/?p=47
本文會介紹如何使用CocoaPods。CocoaPods一個依賴關係管理工具。
那麼什麼是依賴關係管理工具?我們為什麼需要這個工具?
作為一個iOS開發人員,你肯定會使用第三方庫。通常,我們直接把第三方庫的原始碼直接加入到我們的項目中(手動建立一個static library還是很無聊滴),但是這麼做有一些缺點:
- 浪費空間。原始碼可能已經存在你的代碼託管中
- 有些時候,很難獲得某個具體版本的第三方庫
- 沒有一個集中的地方可以查看哪些庫現在可以使用
- 更新新版本的時候,是件無聊的事情,有些時候還很痛苦
一個依賴關係管理工具可以協助你克服大部分上面提到的問題。它會幫你下載你所用到的庫的原始碼、建立和維護你所需要的環境。
本文會用cocoapod來建立一個應用,這個應用用於擷取你在trakt.tv上收聽的節目資訊。
等會你就會發現使用cocoaPods所帶來的好處
CocoaPods的官網是這麼描述它自己的”The best way to manage library dependencies in Objective-C projects”。 就目前來看,所言非虛。
與其你自己每次從Github中下載代碼,然後拷貝到你的項目中,還不如讓CocoaPods來幫你完成這個工作。
trakt.tv這個應用的需求就是-我們希望建立一個應用,可以顯示將要播放的電視節目的資訊。
安裝CocoaPods安裝RubyGems
CocoaPods需要ruby環境,幸運的是所有的mac電腦都已經預裝了ruby,所以你需要更新一下你的RubyGems(如果你的系統版本低於OS X Lion)
只需要輸入如下命令就可以更新你的RubyGems:
sudo gem update --system
安裝command line工具
確保你在你的Xcode中安裝了command line tool(命令列工具)。在最新的Mac OS X Lion和Xcode中,命令列工具預設沒有安裝。可以通過如下方式安裝command line tool:
- 從這裡下載,然後安裝
- 開啟xcode,開啟components介面。Xcode->Preferences->Downloads->Components.裡面應該有一個選項是”Command Line Tools”,後面應該“Install”或者“Update”按鈕,點一下按鈕就行。安裝完成後,按鈕的文字會變成“Installed”。如:
安裝CocoaPods
完成以上步驟後,只需要輸入如下命令就可以安裝CocoaPods了:
sudo gem install cocoapods
pod setup
第一次安裝可能需要一些時間,耐心等待一下
建立一個“CocoaPodsExample”工程
開啟Xcode,然後建立一個基於“Single View Application”的工程。工程的名字“CocoaPodsExample”,“Device Family”選為“iPhone”,選中“Use Storyboards”和“Use Automatic Reference Counting”。如:
點擊下一步然後選擇一個地方存放你的工程。
找一張圖片作為Launch Images。如果沒有合適的可以下載這一張-placeholder.png。把這張圖片拖到工程中,選中“Copy items into destination group’s folder(if needed)”。
下面開啟MainStoryboard.storyboard,並按照如下步驟進行修改:
- 添加一個scroll view。確保這個scroll view的寬度和高度是100%
- 修改scroll view的屬性。開啟屬性選取器,不選“Shows Horizontal Scrollers”,”Shows Verticall Scollers”。選中“Scrolling Enabled”, “Paging Enabled”, “Direction Lock Enabled”
- 添加一個page control。確保這個page control是之前scroll view的兄弟視圖,而不是scroll view的子視圖,並且page control應該在scroll view的前面,不然你就看不到page control了。
storyboard應該看起來像:
最後把scroll view和page view串連到一個outlet中,我們把scroll view的outlet命名為showsScrollView,並且把當前的view controller做為scroll view的delegate。把page control的outlet命名為showPageControl,給page control的“Value Changed”事件綁定一個方法,方法名稱是pageChanged。
現在你可以關了你的Xcode了,接下來就是開始建立你的Podfile了。
建立你的第一個依賴關係
開啟終端,並且開啟存放你的“CocoaPodsExample”工程的檔案夾。輸入如下命令:
touch Podfile
open -e Podfile
TextEdit會被開啟,你可以往開啟的空白Podfile中新增內容了。
我們往Podfile中加入如下內容:
platform :iOS pod 'AFNetworking', '0.9.1'
如你所見,Podfile的格式很簡單。首先,你設定platform為ios(因為有一些架構只支援iOS或者Mac OS X中的一個,而不是都有)。然後,你添加你的第一個依賴-“AFNetworking”,並且指定了,你需要的是0.9.1。
編輯Podfile,除了上面的方法,你還可以使用別的你喜歡的編輯工具,比如vim
有關Podfile的格式,你可以在A Podfile和Podfile(frames)中得到更詳細資料
儲存Podfile之後,我們可以開始配置你的工程了。
在終端中執行如下命令:
pod install
執行完後,你應該會在終端中看到:
如果這個時候,你開啟你工程所在的檔案夾會看到:
CocoaPods建立了一個檔案夾-“Pods”,這個檔案夾存放了所有的依賴的庫和一個workspace檔案,CocoaPodsExample.xcworkspace
VERY IMPORTANT!
從現在開始,你必須用workspace檔案(CocoaPodsExample.xcworkspace)開啟工程,而不是在是用工程檔案(CocoaPodsExample.xcodeproj)
測試AFNetworking
測試AFNetworking是否成功加入已經CocoaPods是否真的工作,可以建立一個基於iOS/Cocoa Touch/Objective-C class的類,我們稱之為SKTraktAPIClient,並且是這個類是NSObject的子類。切記把這個類加入到CocoaPodsExample中而不是Pods工程中。如果你現在看一下你工程檔案的導航,你會看到有兩個獨立的項目:CocoaPodsExample和Pods
開啟SKTraktAPIClient.h,並且用如下代碼替換已有代碼:
#import #import extern NSString *const kTraktAPIKey; extern NSString *const kTraktBaseURLString; @interface SKTrakeAPIClient : AFHTTPClient +(SKTrakeAPIClient *)sharedClient; @end
上面的代碼做了如下事情:
- 第一行代碼匯入Foundation標頭檔
- 第二行代碼匯入AFNetworking的標頭檔,AFNetworking將會是SKTraktAPIClient的標頭檔
- 接下來的兩行定了兩個變數
- 最後我們定義了一個方法,該方法會返回一個獨立的SKTraktAPIClient實力
為什麼在已經有AFNetworking可以處理所有的HTTP請求的情況下,我們還要建立一個SKTraktAPIClient類?原因就在於,我們希望有一個類可以處理所有我們和trakt.tv的請求,可以使用同樣的Base URL和api key。這樣子可以方便之後的維護。
現在開啟SKTraktAPIClient.m,並且用如下的代碼替換已有的代碼:
#import "SKTraktAPIClient.h" #import NSString *const kTraktAPIKey = @"fc3df235908f83107cedd7914950d7a0"; NSString *const kTraktBaseURLString = @"http://api.trakt.tv"; @implementation SKTraktAPIClient +(SKTraktAPIClient *)sharedClient{ static SKTraktAPIClient *_sharedClient = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _sharedClient = [[self alloc] initWithBaseURL:[NSURL URLWithString:kTraktBaseURLString]]; }); return _sharedClient; } -(id)initWithBaseURL:(NSURL *)url{ self = [super initWithBaseURL:url]; if(!self){ return nil; } [self registerHTTPOperationClass:[AFJSONRequestOperation class]]; [self setDefaultHeader:@"Accept" value:@"application/json"]; self.parameterEncoding = AFJSONParameterEncoding; return self; } @end
首先我們匯入了AFJSONRequestOperation.h,這樣子所有的傳回值都是JSON格式的。我們建立了sharedClient,這裡使用了GCD(Grand Central Dispatch),確保了實現SKTraktAPIClient的單例,隨意只要是通過sharedClient方法獲得的SKTraktAPIClient都是同一個執行個體,不會重複建立。除了這個以外,我們還重寫了initWithBaseURL方法,原因就是之後所有用initiWithBaseURL建立的方法,它們都有同樣的response格式-json格式
下面開啟AppDelegate.m加入下面代碼:
#import
在application:didFinishLaunchingWithOptions:加入如下代碼:
[AFNetworkActivityIndicatorManager sharedManager].enabled = YES;
以上代碼開啟了automatic network activity indication manager,這個是AFNetworking支援的功能。通過這種方法,你就不需要每次發送請求開啟activity indication,完成後關閉activity indication。
現在開啟ViewController.m,並且加入如下代碼:
#import "SKTraktAPIClient.h" #import
並用如下代碼替換viewDidLoad
-(void)viewDidLoad { [super viewDidLoad]; // 1 - Create trakt API client SKTraktAPIClient* client = [SKTraktAPIClient sharedClient]; // 2 - Create date instance with today's date NSDate* today = [NSDate date]; // 3 - Create date formatter NSDateFormatter* formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @"yyyyMMdd"; NSString* todayString = [formatter stringFromDate:today]; // 4 - Create API query request NSString* path = [NSString stringWithFormat:@"user/calendar/shows.json/%@/%@/%@/%d", kTraktAPIKey, @"marcelofabri", todayString, 3]; NSURLRequest* request = [client requestWithMethod:@"GET" path:path parameters:nil]; // 5 - Create JSON request operation AFJSONRequestOperation* operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { // 6 - Request succeeded block NSLog(@"%@", JSON); } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { // 7 - Request failed block }]; // 8 - Start request [operation start]; }
編譯運行之後,你可以在你的控制台中看到類似的日誌:
可見,CocoaPods正確幫我們配置了AFNetworking。
附件:http://vdisk.weibo.com/s/kvEHc