这两天一直琢磨着想让自己的一个照片多选框架支持cocoapods下载安装,就搜了好多资料,但是搜到的资料大多都是最基本的,并没有解决我遇到的问题,问题如下:
- 当自己的框架中用到了xib及图片资源的话,怎么解决在cocoapods下载安装后xib初始化失败及图片资源不显示的问题。
那么我们从第一步开始,一步一步来使自己的框架支持cocoapods安装(关于如何在自己的电脑上安装cocoapods的,就请自行搜索,教程很多)。
首先概括一个大概的步骤
- 代码上传到github
- 创建podspec文件
- 在github上创建release版本
- 注册cocoapods账号
- 上传代码到cocoapods
- 检验是否上传成功
- 更新框架版本
重点
- 解决cocoapods下载框架中xib初始化crash的问题
- 解决cocoapods下载框架中图片无法正常显示的问题
代码上传到github
代码上传github的步骤就不说了,相信有github账号的人几乎都会上传,而且现在代码上传github也不需要繁琐的终端操作了,使用Github Desktop客户端即可。
我们还可以观察到,支持cocoapods的代码下载下来之后,都会有*.podspec、LICENSE和.gitignore(该文件为隐藏文件),那么先说LICENSE和.gitignore文件,这个可以再github上创建工作目录时候便勾选出来,如下图
但是通过Github Desktop客户端推上去的工作目录是没有的,怎么再去创建这两个文件,笔者暂时没摸索到,我是直接把这两个文件copy了一份放到了自己的工作目录的。
创建podspec文件
这个简单,首先你需要打开终端进入自己的工作目录的根目录,输入以下命令
touch name.podspec
name便是你最终确定上传到cocoapods上的命名
编辑命令如下
vi name.podspec
英文输入法下,点击"i"进入编辑模式,编辑完毕之后首先点击"esc",然后快捷键"shift+zz"(双击z键)即可
我的ZLPhotoBrowser.podspec文件如下,涉及到更多的cocoapods命令,请自行搜索
在github上创建release版本
点进去之后步骤很简单,填上版本号,标题和简单的描述即可,需要注意的是版本号需要与你的 podspec文件中的 s.version 相同
注册cocoapods账号
打开终端,在终端中输入如下命令
pod trunk register 邮箱地址 '用户名' --description='描述信息'
然后根据终端显示信息,如果成功的话会提示让你去邮箱里确认进行激活
输入如下命令可查看个人cocoapods账号信息
pod trunk me
上传代码到cocoapods
- 在上传cocoapods之前你需要做一件事,便是验证自己的podspec文件格式的有效性,终端命令如下
pod spec lint
如果podspec文件格式不合法,终端内会报出相应的提示
如果通过,终端显示信息如下
那么接下来便是把自己的框架推到cocoapods了,终端命令如下
long:ZLPhotoBrowser long$ pod trunk push ZLPhotoBrowser.podspec --allow-warnings
当然你这里如果不是在podspec文件目录下,也可以指定podspec文件的绝对路径,这里请注意最后使用了"--allow-warnings",为忽略警告的意思,如果不加该关键字的话,如果在执行"pod spec lint"时候报出了警告,那么这里上传框架代码肯定是不成功的。成功的话,会有如下显示
检验是否上传成功
终端输入如下命令搜索你的框架吧
pod search 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资源目录的方式解决的。
最后发几张框架部分功能效果图
转载请注明出处。