https://blog.csdn.net/CodingFire/article/details/52470802
2016年09月08日 13:55:30 CodingFire 閱讀數:9008
通過CocoaPods 將storyboards、xibs和資源文件打包到iOS framework
https://blog.csdn.net/willib/article/details/53190269
版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/CodingFire/article/details/52470802
記得一次面試有人問我有沒有自己開源一些庫,有是有的,但是確沒有制作成可以通過pods導入的庫,此乃一大憾事,后來跟着網上很多教程在那里搗鼓了半天,真的是半天時間,壓根沒用,今天無意間看到一篇博客,http://www.jianshu.com/p/489520b69d8b,參考了一下,有用,但並不是最正確的,里面有許多你不知道的坑等着你在跳,按照上面的步驟,基本和我以前看的一樣,最后還是不行,經過倆小時的摸索,根據一些報錯來查找原因,最后終於解決了這個問題,下面是博主剛剛創建的庫:
如果想要看具體功能可以看:https://github.com/codeliu6572/CustomAlertView
在看這個功能前,確定你會上傳自己的項目代碼到github,不會的可以看博主的文章:http://blog.csdn.net/codingfire/article/details/50387183
下面來介紹下如何把自己的庫制作成可以通過pod導入的庫:
上面那篇博客中的內容可以看下,為了保證正確,博主就重新在下面寫命令:
1.用戶名郵箱注冊,為github的用戶名和綁定郵箱(下面的內容替換為自己的):
pod trunk register codeliu6572@163.com 'codeliu6572' --verbose
如果報錯,一般是pod版本低或者ruby的版本低,這里不再說明解決辦法,自行百度。
2.查看是否注冊成功
pod trunk me
這樣的就代表注冊成功。
3.創建 .podspec文件
這里一定要在工程中創建 .podspec文件,並把庫文件放在一個文件中,看一下博主的:
LICENSE文件(必不可少)和README.md文件都要有,且必須和庫文件放在一個目錄。
創建方法:
pod spec create LHHAlertView
可以通過vim來打開文件操作,博主一般用電腦的文本編輯打開,打開后看到的內容有很多,博主只保留了基本的信息,如下:
//特別說明,里面的注釋是博主為了大家知道什么意思加的,實際使用時一定要去掉
Pod::Spec.new do |s|
//文件名
s.name = 'LHHAlertView'
//版本
s.version = '1.0.1'
//描述信息
s.summary = 'A view like UIAlertView on iOS.'
//這里的主頁自己隨便寫
s.homepage = 'http://blog.csdn.net/codingfire'
//作者
s.authors = { 'codeliu6572' => 'codeliu6572@163.com' }
//資源路徑
s.source = { :git => 'https://github.com/codeliu6572/CustomAlertView.git', :tag => '1.0.1' }
//ARC模式
s.requires_arc = true
//license,一般我們用MIT
s.license = 'MIT'
//允許的最低系統使用版本
s.ios.deployment_target = '7.0'
//庫文件路徑
s.source_files = 'LHHAlertView/*'
end
因為這里沒有第三方庫和系統庫的引入,下面有個新的格式:
這里是博主提交的新的庫,供大家參考,每次通過編輯器打開修改時引號
都會改變,需要注意,所以每次都需要重新復制正確的引號來替換變更
的,小修改可以用vim打開,這樣引號就不會變了,升級版本時,需要打
tag,記得從打tag那一步開始,第一次會輸入賬號密碼,以后會提示授
權,允許即可。每次修改后記得一定要同步到github再繼續下一步操
作。
除了下面的一些資源文件導入外,還有第三方的支持,xib等的支持,詳細信息請查看:https://guides.cocoapods.org/syntax/podspec.html#specification
//特別說明,里面的注釋是博主為了大家知道什么意思加的,實際使用時一定要去掉
Pod::Spec.new do |s|
s.name = 'LHHTopScrollView'
s.version = '1.0.5'
s.summary = 'A banner for iOS.'
s.homepage = 'http://blog.csdn.net/codingfire/article/details/52470802'
s.license = "MIT"
s.ios.deployment_target = '7.0'
s.author = { 'codeliu6572' => 'codeliu6572@163.com' }
s.source = { :git => 'https://github.com/codeliu6572/ScrollVIewBanner.git', :tag => '1.0.5' }
s.source_files = "LHHTopScrollView/*.{h,m}"
s.resources = "LHHTopScrollView/*.png"
如果有多個,后面加逗號隔開如: 'UIKit', 'XXXXXX'
s.framework = 'UIKit'
s.requires_arc = true
s.dependency 'SDWebImage'
end
這里s.source的git地址看下圖:
另外這里再說一個坑:
這里的單引號注意看了,是不一樣的,下面的很明顯能看出來和上面圈起來的不同,用上面的那種,博主試了下,打不出來,那就復制,否則報錯,編輯通不過。切記!!!
4.驗證編輯是否通過
pod lib lint LHHAlertView.podspec
以上為通過截圖,只要按照博主的步驟來,這一步肯定可以通過的。
后來博主在使用時又報錯了,信息如下:
- ERROR | [iOS] xcodebuild: Returned an unsuccessful exit code. You can use `--verbose` for more information.
- ERROR | xcodebuild: /Users/Codeliu/Desktop/程序/VoiceLight/LHHVoiceLight/VoiceLight.h:11:9: error: 'Masonry.h' file not found with <angled> include; use "quotes" instead
第一個錯誤博主怎么找也沒找到,最后查找到原因是因為博主創建文件時第一次創建錯了,把繼承與NSObject的類手動改成了UIView,重新創建后不再報錯;
第二個錯誤是因為Masonry在引入時系統提示我這么引入#import <Masonry.h>,應該是#import "Masonry.h",但是這樣系統報錯,這是因為pods的緣故,build setting->ALways Search User Path ,設置為YES即刻。
5.打上tag,並提交到github
這里打tag一定要加上v,否則會出錯
事實證明這里加不加v都沒關系,但是有一點,tag一定要和podspec文件中的tag一模一樣。至於有其他的寫法,博主嘗試過但是有問題,也許還有沒嘗試的,就不亂下結論了,按照博主提供的方法來寫不會有錯。
git tag 'v1.0.1'
git push --tags
tag打錯了並已提交的
git tag -d xxx //刪除本地tag
接着
git push origin --delete tag xxx //刪除遠程tag,然后重新打tag
提交時會提示輸入賬號密碼,按照自己的github的賬號密碼來輸入。
成功后:
6.把podspec文件提交到github的庫倉庫中
pod trunk push LHHAlertView.podspec
//如果有警告 后面加 --allow-warnings
這一步有可能會因為pods版本低而失敗,根據提示信息更新pods
成功后截圖:
7.搜索提交的庫
pod search LHHAlertView
然后就看到一開始的那張圖了。
這里再啰嗦幾句,以博主的這個Demo為例,Demo里面已經有了庫文件,但是在Demo同等級的目錄中依然要放一個庫文件,目前博主成功的文件目錄就是這樣的,podspec文件一定要和庫文件在一個目錄中,其他注意事項每一步都有介紹,一定要注意。
總結:要把自己的庫制作成通過pods導入還是有一定難度的,網上很多方法看着跟博主這里差不多,其實命令都一樣,但是卻有明顯的不同,那就是細節部分,比如引號,打tag時的v,目錄結構等等,稍有不慎就可能通不過編輯,就說這么多,如果遇到問題,歡迎加群討論。
后來遇到的坑:
1.通過代碼創建的podspec文件里面都是雙引號,博主用的都是單引號,經測試,無影響,還有UIKIT等庫和第三方庫的引入,以及版本升級,這一部分已經放在這里;
2.發現一個問題,如果你在某個庫中用了NSInteger,會報警告,原因是:typedef long NSInteger;類似這種情況的還有別的,如果遇到你可以替換成像這里應該是long,也可以選擇忽略警告,比如:pod trunk push ScrollSliderView.podspec –allow-warnings;
3.有時候在push時會遇到這樣的報錯:[!] There was an error pushing a new version to trunk: Net::OpenTimeout 不要驚慌,僅僅是因為網絡不好沒有push成功,不妨再試一次。