Cocoapods作為OS X和iOS開發平臺的類庫管理工具,已經非常完善和強大。通常我們用pod來管理第三方開源類庫,但我們也極有可能會開發一個用pod管理依賴關系的靜態類庫給其他人使用,而又不愿意公開源代碼,比如一些SDK,那么就需要打包成.a文件。本文將以一個依賴于ASIHTTPRequest的靜態類庫,來演示如何創建使用了CocoaPods的靜態類庫以及打包的過程。
創建靜態庫,有2種方法。
過程比較繁瑣,純體力活不推薦,大體步驟說下
Cocoa Touch Static Library;Podfile文件;pod install完成整個項目的搭建;pod install完成示例項目的搭建。只需要輸入pod的lib命令即可完成初始項目的搭建,下面詳細說明具體步驟,以BZLib作為項目名演示。
pod lib create BZLib。在此期間需要確認下面4個問題。Would you like to provide a demo application with your library? [ Yes / No ]yesWhich testing frameworks will you use? [ Specta / Kiwi / None ]KiwiWould you like to do view based testing? [ Yes / No ]NoWhat is your class prefix?BZ第一個問題詢問是否提供一個demo項目,通常選擇Yes,其他的可以根據需要選擇。命令執行完后,就會創建好一個通過cocoapods管理依賴關系的基本類庫框架。
BZLib.podspec文件,修改類庫配置信息,結果像這樣。Pod::Spec.new do |s| s.name = "BZLib" s.version = "0.1.0" s.summary = "A short description of BZLib." s.description = <<-DESC An optional longer description of BZLib * Markdown format. * Don't worry about the indent, we strip it! DESC s.homepage = "https://github.com/<GITHUB_USERNAME>/BZLib" # s.screenshots = "www.example.com/screenshots_1", "www.example.com/screenshots_2" s.license = 'MIT' s.author = { "brycezhang" => "brycezhang.cn@Gmail.com" } s.source = { :git => "https://github.com/<GITHUB_USERNAME>/BZLib.git", :tag => s.version.to_s } # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>' s.platform = :ios, '6.0' s.requires_arc = true s.source_files = 'Pod/Classes/**/*.{h,m}' s.resource_bundles = { 'BZLib' => ['Pod/Assets/*.png'] } s.public_header_files = 'Pod/Classes/**/*.h' s.frameworks = 'MobileCoreServices', 'CFNetwork', 'CoreGraphics' s.libraries = 'z.1' s.dependency 'YSASIHTTPRequest', '~> 2.0.1'end按照默認配置,類庫的源文件將位于Pod/Classes文件夾下,資源文件位于Pod/Assets文件夾下,可以修改s.source_files和s.resource_bundles來更換存放目錄。s.public_header_files用來指定頭文件的搜索位置。s.frameworks和s.libraries指定依賴的SDK中的framework和類庫,需要注意,依賴項不僅要包含你自己類庫的依賴,還要包括所有第三方類庫的依賴,只有這樣當你的類庫打包成.a或.framework時才能讓其他項目正常使用。示例中s.frameworks和s.libraries都是ASIHTTPRequest的依賴項。podspec文件的詳細說明可以看Podspec Syntax Reference。
pod install,讓demo項目安裝依賴項并更新配置。localhost:Example bryce$ pod install --no-repo-updateAnalyzing dependenciesFetching podspec for `BZLib` from `../`Downloading dependenciesInstalling BZLib 0.1.0 (was 0.1.0)Using Kiwi (2.3.1)Installing Reachability (3.2)Installing YSASIHTTPRequest (2.0.1)Generating Pods projectIntegrating client project添加BZHttphelper類,注意文件存放的位置在Pod/Classes目錄下,跟podspec配置要一致。
運行Pod install,讓demo程序加載新建的類。也許你已經發現了,只要新增加類/資源文件或依賴的三方庫都需要重新運行Pod install來應用更新。
編寫代碼。示例代碼很簡單,創建了一個GET請求的包裝方法。
#import "BZHttphelper.h"#import <YSASIHTTPRequest/ASIHTTPRequest.h>@implementation BZHttphelper- (void)getWithUrl:(NSString *)url withCompletion:(void (^)(id responSEObject))completion failed:(void (^)(NSError *error))failed{ ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:url]]; __weak ASIHTTPRequest *weakrequest = request; [request setCompletionBlock:^{ NSString *responseString = [weakrequest responseString]; completion(responseString); }]; [request setFailedBlock:^{ NSError *error = [weakrequest error]; failed(error); }]; [request start];}@enddemo項目中調用測試。
#import "BZViewController.h"#import <BZLib/BZHttphelper.h>@interface BZViewController (){ BZHttphelper *_httpHelper;}@end@implementation BZViewController- (void)viewDidLoad{ [super viewDidLoad]; _httpHelper = [BZHttphelper new]; [_httpHelper getWithUrl:@"http://wcf.open.VEVb.com/blog/u/brycezhang/posts/1/5" withCompletion:^(id responseObject) { NSLog(@"[Completion]:%@", responseObject); } failed:^(NSError *error) { NSLog(@"[Failed]:%@", error); }];}- (void)didReceiveMemoryWarning{ [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated.}@end成功打印,調用成功!
2014-11-23 16:52:23.946 BZLib[6329:96133] [Completion]:<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客園...s.source。根據你的實際路徑修改。s.source = { :git => "/Users/name/workspace/BZLib", :tag => '0.1.0' }git add .git commit -a -m 'v0.1.0'git tag -a 0.1.0 -m 'v0.1.0'開發完成靜態類庫之后,需要運行pod lib lint驗證一下類庫是否符合pod的要求??梢酝ㄟ^添加--only-errors忽略一些警告。
pod lib lint BZLib.podspec --only-errors --verbose...BZLib passed validation.需要使用一個cocoapods的插件cocoapods-packager來完成類庫的打包。當然也可以手動編譯打包,但是過程會相當繁瑣。
安裝打包插件
終端執行以下命令
sudo gem install cocoapods-packager打包
命令很簡單,執行
pod package BZLib.podspec --library --force其中--library指定打包成.a文件,如果不帶上將會打包成.framework文件。--force是指強制覆蓋。最終的目錄結構如下
|____BZLib.podspec|____ios| |____libBZLib.a需要特別強調的是,該插件通過對引用的三方庫進行重命名很好的解決了類庫命名沖突的問題。
文中的示例代碼下載
BZLib
本文是通過pod及其插件實現了創建和打包的功能,如果對具體實現細節感興趣可以查看相關源碼,或者查看文末的擴展閱讀進一步了解。
新聞熱點
疑難解答