本文為投稿文章,作者:奴良(簡書)
這兩天一直琢磨著想讓自己的一個照片多選框架支持CocoaPods下載安裝,就搜了好多資料,但是搜到的資料大多都是最基本的,並沒有解決我遇到的問題,問題如下:
當自己的框架中用到了xib及圖片資源的話,怎麼解決在CocoaPods下載安裝後xib初始化失敗及圖片資源不顯示的問題。
那麼我們從第一步開始,一步一步來使自己的框架支持CocoaPods安裝(關於如何在自己的電腦上安裝CocoaPods的,就請自行搜索,教程很多)。
首先概括一個大概的步驟:
代碼上傳到Github
創建podspec文件
在Github上創建release版本
注冊CocoaPods賬號
上傳代碼到CocoaPods
檢驗是否上傳成功
更新框架版本
重點
解決CocoaPods下載框架中xib初始化crash的問題
解決CocoaPods下載框架中圖片無法正常顯示的問題
代碼上傳到Github
代碼上傳Github的步驟就不說了,相信有Github賬號的人幾乎都會上傳,而且現在代碼上傳Github也不需要繁瑣的終端操作了,使用Github Desktop客戶端即可。
Github Desktop
我們還可以觀察到,支持CocoaPods的代碼下載下來之後,都會有*.podspec、LICENSE和.gitignore(該文件為隱藏文件),那麼先說LICENSE和.gitignore文件,這個可以再github上創建工作目錄時候便勾選出來,如下圖:
creat repository
result
但是通過Github Desktop客戶端推上去的工作目錄是沒有的,怎麼再去創建這兩個文件,筆者暫時沒摸索到,我是直接把這兩個文件copy了一份放到了自己的工作目錄的。
創建podspec文件
這個簡單,首先你需要打開終端進入自己的工作目錄的根目錄,輸入以下命令
touch name.podspec
name便是你最終確定上傳到CocoaPods上的命名。
編輯命令如下
vi name.podspec
英文輸入法下,點擊"i"進入編輯模式,編輯完畢之後首先點擊"esc",然後快捷鍵"shift+zz"(雙擊z鍵)即可。
我的ZLPhotoBrowser.podspec文件如下,涉及到更多的CocoaPods命令,請自行搜索
ZLPhotoBrowser.podspec
在Github上創建release版本
創建release版本
點進去之後步驟很簡單,填上版本號,標題和簡單的描述即可,需要注意的是版本號需要與你的podspec文件中的s.version 相同。
注冊CocoaPods賬號
打開終端,在終端中輸入如下命令:
pod trunk register 郵箱地址 '用戶名' --description='描述信息'
然後根據終端顯示信息,如果成功的話會提示讓你去郵箱裡確認進行激活。
輸入如下命令可查看個人CocoaPods賬號信息
pod trunk me
上傳代碼到CocoaPods
在上傳CocoaPods之前你需要做一件事,便是驗證自己的podspec文件格式的有效性,終端命令如下
pod spec lint
如果podspec文件格式不合法,終端內會報出相應的提示。
如果通過,終端顯示信息如下
podspec
那麼接下來便是把自己的框架推到CocoaPods了,終端命令如下
long:ZLPhotoBrowser long$ pod trunk push ZLPhotoBrowser.podspec --allow-warnings
當然你這裡如果不是在podspec文件目錄下,也可以指定podspec文件的絕對路徑,這裡請注意最後使用了"--allow-warnings",為忽略警告的意思,如果不加該關鍵字的話,如果在執行"pod spec lint"時候報出了警告,那麼這裡上傳框架代碼肯定是不成功的。成功的話,會有如下顯示:
push success
檢驗是否上傳成功,終端輸入如下命令搜索你的框架吧
pod search ZLPhotoBrowser
如果成功的話,終端顯示信息如下:
ZLPhotoBrowser
更新框架版本
框架上傳後,避免不了版本的更新,更新版本也簡單,上傳最新的代碼,在github上創建新的release版本(再次提醒注意版本號與podspec文件的s.version保持一致),然後再次執行命令即可:
long:ZLPhotoBrowser long$ pod trunk push ZLPhotoBrowser.podspec --allow-warnings
解決CocoaPods下載框架中xib初始化crash的問題
由於框架中使用到了UITableView及UICollectionView等UI,所以有存在對應的cell的xib文件。
我們通過cocoapods去下載我們的框架,如果存在xib,那麼我們平常初始化xib的代碼(如下)便不能正常工作了。
[[[NSBundle mainBundle] loadNibNamed:@"xibName" owner:self options:nil] lastObject]; [self.collectionView registerNib:[UINib nibWithNibName:@"xibName" bundle:nil] forCellWithReuseIdentifier:@"ZLCollectionCell"];
因為通過mainBundle不能獲取到我們的xib了,解決方法如下
#define kZLPhotoBrowserBundle [NSBundle bundleForClass:[self class]] [[kZLPhotoBrowserBundle loadNibNamed:@"ZLPhotoActionSheet" owner:self options:nil] lastObject]; [self.collectionView registerNib:[UINib nibWithNibName:@"ZLCollectionCell" bundle:kZLPhotoBrowserBundle] forCellWithReuseIdentifier:@"ZLCollectionCell"];
這樣之後,無論是通過copy文件夾方式還是CocoaPods下載安裝的方式,都能正常使用xib進行初始化了
解決CocoaPods下載框架中圖片無法正常顯示的問題
解決完了xib的初始化問題,圖片資源不顯示又是一個令人頭痛的問題。我在測試期間,得出如下結果:
通過CocoaPods下載安裝,如果xib中直接填寫好的圖片,則圖片資源能直接顯示,如果通過代碼"[UIImage imageNamed:@""]"去設置的話,則圖片資源根本顯示不了
最終解決方法:
創建bundle資源目錄
command+N -> Resource -> Settings Bundle
刪除bundle攜帶的無用文件,把圖片資源添加到bundle資源內,
改變代碼圖片路徑
// 圖片路徑 #define kZLPhotoBrowserSrcName(file) [@"ZLPhotoBrowser.bundle" stringByAppendingPathComponent:file] #define kZLPhotoBrowserFrameworkSrcName(file) [@"Frameworks/ZLPhotoBrowser.framework/ZLPhotoBrowser.bundle" stringByAppendingPathComponent:file] kZLPhotoBrowserSrcName(file) 為通過copy文件夾方式獲取圖片路徑的宏 kZLPhotoBrowserFrameworkSrcName(file) 為通過cocoapods下載安裝獲取圖片路徑的宏
之後修改代碼中設置圖片的方式如下:
UIImage *img = [UIImage imageNamed:kZLPhotoBrowserSrcName(@"img.png")]?:[UIImage imageNamed:kZLPhotoBrowserFrameworkSrcName(@"img.png")];
到了這一步,ok,很好,問題已經解決。
結束語
感謝參考的兩篇文章:
讓代碼支持CocoaPods
iOS為自己的庫添加CocoaPods支持
同時也感謝下小碼哥(MJ李明傑老師),解決圖片不顯示的方式是通過查找各大框架的podspec的等相關才最終在MJRefresh中找到以bundle資源目錄的方式解決的。