【转】从零开始,让你的框架支持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文件
这个简单,首先你需要打开终端进入自己的工作目录的根目录,输入以下命令
1
|
touch name.podspec |
name便是你最终确定上传到CocoaPods上的命名。
编辑命令如下
1
|
vi name.podspec |
英文输入法下,点击"i"进入编辑模式,编辑完毕之后首先点击"esc",然后快捷键"shift+zz"(双击z键)即可。
我的ZLPhotoBrowser.podspec文件如下,涉及到更多的CocoaPods命令,请自行搜索
ZLPhotoBrowser.podspec
在Github上创建release版本
创建release版本
点进去之后步骤很简单,填上版本号,标题和简单的描述即可,需要注意的是版本号需要与你的podspec文件中的s.version 相同。
注册CocoaPods账号
打开终端,在终端中输入如下命令:
1
|
pod trunk register 邮箱地址 '用户名' --description= '描述信息' |
然后根据终端显示信息,如果成功的话会提示让你去邮箱里确认进行激活。
输入如下命令可查看个人CocoaPods账号信息
1
|
pod trunk me |
上传代码到CocoaPods
在上传CocoaPods之前你需要做一件事,便是验证自己的podspec文件格式的有效性,终端命令如下
1
|
pod spec lint |
如果podspec文件格式不合法,终端内会报出相应的提示。
如果通过,终端显示信息如下
podspec
那么接下来便是把自己的框架推到CocoaPods了,终端命令如下
1
|
long:ZLPhotoBrowser long$ pod trunk push ZLPhotoBrowser.podspec --allow-warnings |
当然你这里如果不是在podspec文件目录下,也可以指定podspec文件的绝对路径,这里请注意最后使用了"--allow-warnings",为忽略警告的意思,如果不加该关键字的话,如果在执行"pod spec lint"时候报出了警告,那么这里上传框架代码肯定是不成功的。成功的话,会有如下显示:
push success
检验是否上传成功,终端输入如下命令搜索你的框架吧
1
|
pod search ZLPhotoBrowser |
如果成功的话,终端显示信息如下:
1
|
ZLPhotoBrowser |
更新框架版本
框架上传后,避免不了版本的更新,更新版本也简单,上传最新的代码,在github上创建新的release版本(再次提醒注意版本号与podspec文件的s.version保持一致),然后再次执行命令即可:
1
|
long:ZLPhotoBrowser long$ pod trunk push ZLPhotoBrowser.podspec --allow-warnings |
解决CocoaPods下载框架中xib初始化crash的问题
由于框架中使用到了UITableView及UICollectionView等UI,所以有存在对应的cell的xib文件。
我们通过cocoapods去下载我们的框架,如果存在xib,那么我们平常初始化xib的代码(如下)便不能正常工作了。
1
2
|
[[[NSBundle mainBundle] loadNibNamed:@ "xibName" owner:self options:nil] lastObject]; [self.collectionView registerNib:[UINib nibWithNibName:@ "xibName" bundle:nil] forCellWithReuseIdentifier:@ "ZLCollectionCell" ]; |
因为通过mainBundle不能获取到我们的xib了,解决方法如下
1
2
3
|
#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资源目录
1
|
command+N -> Resource -> Settings Bundle |
删除bundle携带的无用文件,把图片资源添加到bundle资源内,
改变代码图片路径
1
2
3
4
5
|
// 图片路径 #define kZLPhotoBrowserSrcName(file) [@"ZLPhotoBrowser.bundle" stringByAppendingPathComponent:file] #define kZLPhotoBrowserFrameworkSrcName(file) [@"Frameworks/ZLPhotoBrowser.framework/ZLPhotoBrowser.bundle" stringByAppendingPathComponent:file] kZLPhotoBrowserSrcName(file) 为通过copy文件夹方式获取图片路径的宏 kZLPhotoBrowserFrameworkSrcName(file) 为通过cocoapods下载安装获取图片路径的宏 |
之后修改代码中设置图片的方式如下:
1
|
UIImage *img = [UIImage imageNamed:kZLPhotoBrowserSrcName(@ "img.png" )]?:[UIImage imageNamed:kZLPhotoBrowserFrameworkSrcName(@ "img.png" )]; |
到了这一步,ok,很好,问题已经解决。
结束语
感谢参考的两篇文章:
同时也感谢下小码哥(MJ李明杰老师),解决图片不显示的方式是通过查找各大框架的podspec的等相关才最终在MJRefresh中找到以bundle资源目录的方式解决的。
http://www.cocoachina.com/ios/20160415/15939.html
【转】从零开始,让你的框架支持CocoaPods的更多相关文章
- 从零开始,让你的框架支持CocoaPods
本文为投稿文章,作者:奴良(简书) 这两天一直琢磨着想让自己的一个照片多选框架支持CocoaPods下载安装,就搜了好多资料,但是搜到的资料大多都是最基本的,并没有解决我遇到的问题,问题如下: 当自己 ...
- 在IntelliJ IDEA中添加框架支持时找不到Hibernate的解决办法
问题描述 第一次在Add Frameworks support界面中添加hibernate支持的时候,异常中断,导致没有成功添加. 第二次进入Add Frameworks support窗口时,发现找 ...
- 读《架构探险——从零开始写Java Web框架》
内容提要 <架构探险--从零开始写Java Web框架>首先从一个简单的 Web 应用开始,让读者学会如何使用 IDEA.Maven.Git 等开发工具搭建 Java Web 应用:接着通 ...
- MVC 插件化框架支持原生MVC的Area和路由特性
.NET MVC 插件化框架支持原生MVC的Area和路由特性 前面开放的源码只是简单的Plugin的实现,支持了插件的热插拔,最近晚上偶然想到,原生的MVC提供Areas和RouteAtrribut ...
- 让python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE等请求
这两天在用python的bottle框架开发后台管理系统,接口约定使用RESTful风格请求,前端使用jquery ajax与接口进行交互,使用POST与GET请求时都正常,而Request Meth ...
- 【EatBook】-NO.3.EatBook.3.JavaArchitecture.2.001-《架构探险:从零开始写Java Web框架》-
1.0.0 Summary Tittle:[EatBook]-NO.3.EatBook.3.JavaArchitecture.2.001-<架构探险:从零开始写Java Web框架>- S ...
- CocoaPods学习系列2——使自己的项目支持CocoaPods管理
该篇记录使自己的项目支持CocoaPods管理. 要达到这一目的,需要如下步骤: 1.将自己的项目提交到github,添加开源协议license 2.添加podspec文件 3.验证podspec,成 ...
- IDEA02 利用Maven创建Web项目、为Web应用添加Spring框架支持、bean的创建于获取、利用注解配置Bean、自动装配Bean、MVC配置
1 环境版本说明 Jdk : 1.8 Maven : 3.5 IDEA : 专业版 2017.2 2 环境准备 2.1 Maven安装及其配置 2.2 Tomcat安装及其配置 3 详细步骤 3.1 ...
- .NET Core 多框架支持(net45+netstandard20)实践中遇到的一些问题总结
.NET Core 多框架支持(net45+netstandard20)实践中遇到的一些问题总结 前言 本文主要是关于.NET Standard 代码 在多框架 和 多平台 支持自己实践过程中遇到的一 ...
随机推荐
- CocoaPods requires your terminal to be using UTF-8 encoding
WARNING: CocoaPods requires your terminal to be using UTF-8 encoding. See https://github.com/CocoaPo ...
- Android 按键消息处理Android 按键消息处理
在android系统中,键盘按键事件是由SystemServer服务来管理的:然后在以消息的形式分发给应用程序处理.产生键盘按键事件则是有Linux kernel的相关驱动来实现. 键盘消息有别于其他 ...
- Qt之自定义界面(窗体缩放)
简述 通过前两节内容,我们实现了自定义窗体的移动,以及自定义标题栏-用来显示窗体的图标.标题,以及控制窗体最小化.最大化.关闭. 在这之后,我们还缺少窗体的缩放-当鼠标移动到窗体的边框-左.上.右.下 ...
- 命名空间“System.Web”中不存在类型或命名空间名称“Script”(是缺少程序集引用吗?)
网上有些资料说,在项目上鼠标右键,添加引用→.Net→System.Web.Entensions就可以了. 实际上很多时候在项目中的添加引用窗口上,根本找不到System.Web.Entensions ...
- UVa 11389 (贪心) The Bus Driver Problem
题意: 有司机,下午路线,晚上路线各n个.给每个司机恰好分配一个下午路线和晚上路线. 给出行驶每条路线的时间,如果司机开车时间超过d,则要付加班费d×r. 问如何分配路线才能使加班费最少. 分析: 感 ...
- BZOJ2151: 种树
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2151 题解:此题=数据备份.喜闻乐见挂链表. 代码: #include<cstdio&g ...
- HDU 5301 Buildings 建公寓(逻辑,水)
题意:有一个包含n*m个格子的矩阵,其中有一个格子已经被染黑,现在要拿一些矩形来填充矩阵,不能填充到黑格子,但是每一个填充进去的矩形都必须至少有一条边紧贴在矩阵的边缘(4条边)的.用于填充的矩形其中最 ...
- 【大数加法】POJ-1503、NYOJ-103
1503:Integer Inquiry 总时间限制: 1000ms 内存限制: 65536kB 描述 One of the first users of BIT's new supercompu ...
- Delphi 为什么它提示PCHAR是不安全的类型呢 Unsafe type 'PChar'
DELPHI7已经考虑到了移植到点NET的问题,在点NET里,指针是不安全的.至于为什么有的人遇到,有的人没有遇到,那是因为各人的编译选项不同.在Project菜单下选Options“Compiler ...
- iOS 获取已连接的wifi信息
转:http://blog.csdn.net/marujunyy/article/details/16843173 首先需要 #import <SystemConfiguration/Cap ...