背景
關(guān)于使用Cocoapods打包靜態(tài)庫或者是Framework的文章,網(wǎng)上一搜一堆.可是當你讀完,發(fā)現(xiàn)用處有限.它們的都是用最簡單的場景串了一遍打包的流程,而整個過程中的多個坑,卻根本沒有提及.這就造成了一個假象,Cocoapods打包framework是簡單愉快的,放棄原來的創(chuàng)建framework的形式吧!結(jié)果,當熱情滿滿的開發(fā)者去用的時候,發(fā)現(xiàn)已經(jīng)入了歧途了!
本人目前正在處理一款語音框架的工作,所以正好整理出來,希望能夠?qū)Υ蠹矣袔椭?
Cocoapods流程
關(guān)于如何安裝Cocoapods
,在此就不贅述了.如果沒有Cocoapods
使用經(jīng)驗,也不建議看這篇文章. 另外,建議將Cocoapods
升級到最新版本(包括最新的beta),升級命令如下:
gem install cocoapods --pre
創(chuàng)建基本的工程結(jié)構(gòu)
- 通過命令創(chuàng)建一個規(guī)范規(guī)程(這個很重要,方便你的開發(fā)與驗證)
pod lib create YouFrameworkName
- 接下來就是一些問題,根據(jù)實際情況選擇.(我這開發(fā)的OC版本)
特別說明: 一定要創(chuàng)建Demo Application!這個對你的開發(fā)有極大的幫助!!
具體步驟也不贅述了,給大家?guī)灼獏⒖嘉恼?做完就具備了基本的結(jié)構(gòu)了.主要是想一塊繼續(xù)深入下去.
繼續(xù)深入
有一個問題需要注意: 如果你選擇打包.a的靜態(tài)庫,那么cocoapods是不會給你生成頭文件的 ,這就意味著,其實,你只能打包framework.
按照上面的兩篇文章做完,你會發(fā)現(xiàn).握草,根本不夠項目用啊.我項目還有三方的framework
,還有三方的.a
庫,還想添加pch
文件...
另外,關(guān)于各種路徑的問題,例如:s.source_files
和s.header_dir
這些,經(jīng)常會被Cocoapods報錯:pattern匹配不到任何文件.其實,只要記住一個原則:你的庫路徑(可能是線上git庫也可能是本地git庫)+你的指定路徑 = 要找的文件路徑,那么就一定沒問題. 例如我的庫路徑是::git => '/Users/kenny/Documents/LTVoiceAssistant'
而我指定的s.source_files = 'LTVoiceAssistant/Classes/**/*.{c,h,hh,m,mm,cpp,a,pch}'
,它們兩個拼接,正好是我各種源碼文件的路徑.
三方Framework和Library
在項目中,我們經(jīng)常會有一些以文件形式存在的framework和.a,例如我項目中就有百度的語音識別和一個高德的.而由于某些原因,你不能用cocoapods將其管理,只能拖到項目中,cocoapods使用vendored_frameworks
和vendored_libraries
字段進行設(shè)置:
s.ios.vendored_libraries = 'LTVoiceAssistant/Classes/libBDVoiceRecognitionClient.a',
'LTVoiceAssistant/Classes/libBDSSpeechSynthesizer.a'
s.ios.vendored_frameworks = 'LTVoiceAssistant/Classes/*.framework'
pch
如果你不是從零開始,而是將其他項目的代碼剝離打包framework的話,這個絕對會幫你大忙,因為cocoapods的驗證,會檢查你代碼的依賴性,如果有照不到的頭文件或者引入關(guān)系不對,是通不過驗證的.podspec中,提供了兩種方式添加pch文件.
方法一 : 使用s.prefix_header_contents
用法如下:
s.prefix_header_contents = '#import "AHeader.h"','#import "BHeader.h"'
可以看出,簡單方便.但是也是因為簡單,所以一些負責的宏之類的,你用這個是沒法完成的.
方法二: 添加pch文件.
首先framework工程里(不是DemoApplication中)添加pch文件.然后將文件加入到編譯的source中(如果你是拷貝進來的頭文件)
最后,在podspec中,添加下面的信息:
s.prefix_header_file = 'LTVoiceAssistant/Classes/Global/LTSpeech-prefix.pch'
在cocoapods的issue中,作者特別提到了.如果報找不到,那么是Xcode沒找到,不是cocoapods,所以,確保將pch加入了編譯.
xib和storyboard
如果你的代碼中包含Xib和Storyboard,需要注意,這幾個文件是需要添加到資源中的.
s.resource = 'LTVoiceAssistant/Classes/Cells/*.xib'