制作SDK,使用.a或.framwork的方式封裝SDK,然后放在github上,以及需要支持cocoapods方式.本文參考Bryce Zhang大神的文章來講一下我的打包制作過程,以及遇到的坑,希望對正在進行SDK開發(fā)的新手一些幫助.大致先講下流程,首先創(chuàng)建一個本地的庫用于開發(fā),然后打包.framwork,重新制作一個庫用于上傳到github上去.當然如果是個人的庫,我還是不建議大家打包靜態(tài)庫,畢竟開源才是程序員精神.
首先需要講下為什么需要使用CocoaPods打包靜態(tài)庫,因為cocoapods支持一鍵打包(夸張了_),也支持解決在開發(fā)SDK過程中使用第三方庫沖突的問題,不用再像傳統(tǒng)制作方式一樣修改所有第三方庫的方法名了.
1.使用pod創(chuàng)建開發(fā)庫
執(zhí)行命令 pod lib create MAPalyer
.再此期間需要確認下面5個問題.
What language do you want to use?? [ Swift / ObjC ]
ObjC
Would you like to include a demo application with your library? [ Yes / No ]
yes
Which testing frameworks will you use? [ Specta / Kiwi / None ]
Kiwi
Would you like to do view based testing? [ Yes / No ]
No
What is your class prefix?// 類的前綴
MA
此時,就會創(chuàng)建一個pod的標準模板工程.
3.添加開發(fā)代碼
打開MaPlayer/Example/MAPlayer.xcworkspace,在Pods/Development Pods/MAPlayer下添加SDK代碼.并提交git管理.
git add.
git commit -m "First commit"
git tag 1.0
4.打開MAPlayer.podspec
文件查看類庫配置信息.
Pod::Spec.new do |s|
s.name = 'MAPlayer' // 庫的名稱
s.version = '1.0' // 庫的版本號
s.summary = 'A short description of MAPlayer.' // 庫的簡單描述
s.description = <<-DESC // 庫的詳細描述
TODO: Add long description of the pod here.
DESC
s.homepage = 'https://github.com/<GITHUB_USERNAME>/MAPlayer' // github上的地址,這個可以不管,因為咱們用的是本地的
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' // 這個我沒有使用
s.license = { :type => 'MIT', :file => 'LICENSE' } // MIT協(xié)議,已經(jīng)創(chuàng)建好了,不用管
s.author = { 'fengyunjue' => 'ma772528138@qq.com' } // 開發(fā)者信息
// 庫的來源,可以使用git,bitbucket或本地s.source = { :git => 'MAPlayer/MAPlayer.git', :tag => s.version.to_s } // 本地來源的寫法
s.source = { :git => 'https://github.com/ma772528138@qq.com/MAPlayer.git', :tag => s.version.to_s } // git來源的寫法
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
s.ios.deployment_target = '8.0' // 庫的版本
s.source_files = 'MAPlayer/Classes/**/*' // 庫的所有有文件
// 這個是庫的圖片集合,他會將所有的圖片打包成bundle使用, #標示等同于xcode里的//功能
# s.resource_bundles = {
// 這里是設(shè)置圖片bundle名稱為"MAPlayer.bundle" , '*.png'是匹配所有的png格式的圖片,你也可以使用''MAPlayer/Assets/*',
匹配Assets下的所有文件,也可以單獨設(shè)置圖片[..../1.png,..../2.jpg]
# 'MAPlayer' => ['MAPlayer/Assets/*.png']
# 'image' => ['..../*'] // 這樣相當于有設(shè)置了一個bundle
# }
// 注意:制作framwork,公開的頭文件里如果import了其他文件,比如a.h里包含了b.h,則b.h也必須加入到public_header_files里
# s.public_header_files = 'Pod/Classes/**/*.h'
// 依賴項不僅要包含你自己類庫的依賴,還要包括所有第三方類庫的依賴,例如FMDB,就需要依賴sqlite3
#s.frameworks = 'UIKit', 'MapKit'
#s.libraries = 'sqlite3'
// 支持依賴第三方靜態(tài)庫
#s.vendored_library = '**/libopencore-amrnb.a'
// 依賴的第三方庫
#s.dependency 'AFNetworking', '~> 2.3'
#s.dependency 'FMDB'
end
podspec文件的詳細說明可以看Podspec Syntax Reference.
- s.public_header_files很重要,需要將你要公開的頭文件放進去,使用相對路徑即可.如果公開的頭文件里如果import了其他文件,比如a.h里包含了b.h,則b.h也必須加入到public_header_files里. 可以分開寫,如'Pod/Classes/Test/*.h','Pod/Classes/Test1/Test1.h'.
- 修改SDK的版本號與你git的tag一致
5.使用CocoaPods Packager打包靜態(tài)庫
1.使用sudo gem install cocoapods-packager
安裝CocoaPods Packager,查看cocoapods-packager.
2.使用
pod lib lint MAPlayer.podspec --no-clean --verbose --allow-warnings
檢測創(chuàng)建的庫是否符合pod的要求.符合要求會提示MAPlayer passed validation.
3.打包靜態(tài)庫
使用
pod package MAPlayer.podspec --force
打包靜態(tài)庫.此時會提示下圖的錯誤.
這是因為沒有找到這個source.你可以將該項目提交到GitHub上管理.
需要處理MAPlayer.podspec里的source.
// git地址修改為正確的GitHub地址
s.source = { :git => 'https://github.com/ma772528138@qq.com/MAPlayer.git', :tag => s.version.to_s }
或者將地址修改成本地的git
// 注意,這里只能使用絕對地址
s.source = { :git => '/Users/admin/Documents/WorkSpace/MAPlayer', :tag => s.version.to_s }
此時會在MAPlayer/生成MAPlayer-1.0.靜態(tài)庫制作完成.
注意事項
- 如果SDK的1.0版本制作完成后發(fā)現(xiàn)需要修改代碼后重新制作1.0,需要先清除本地緩存的版本
pod cache clean MAPlayer
,否則,重新打包的還是舊的代碼. - CocoaPods Packager解決第三方庫沖突的方式是通過給所有第三方庫的方法添加前綴的方式處理,如MAPlayer添加的是步驟一里設(shè)置的MA前綴.注意盡量不要添加含有Category的開源庫,因為CocoaPods Packager沒有修改Category的前綴,雖然不會造成沖突,但會覆蓋類的相同方法.
- 如果靜態(tài)庫中含有Category,在使用靜態(tài)庫時需要在Build Seings/Other Linker Flags里添加-ObjC,否則編譯會報錯.
-
pod package MAPlayer.podspec --force
打包成.framework靜態(tài)庫,--fore指強制覆蓋已經(jīng)制作的靜態(tài)庫
pod package MAPlayer.podspec --library --force
打包.a靜態(tài)庫.需要注意的是,打包.a只生成了.a文件,頭文件需要自己添加,這應(yīng)該算CocoaPods Packager的一個bug.