本文为投稿文章,作者:奴良(简书

这两天一直琢磨着想让自己的一个照片多选框架支持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文件

这个简单,首先你需要打开终端进入自己的工作目录的根目录,输入以下命令

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,很好,问题已经解决。

结束语

感谢参考的两篇文章:

让代码支持CocoaPods

iOS为自己的库添加CocoaPods支持

同时也感谢下小码哥(MJ李明杰老师),解决图片不显示的方式是通过查找各大框架的podspec的等相关才最终在MJRefresh中找到以bundle资源目录的方式解决的。

从零开始,让你的框架支持CocoaPods的更多相关文章

  1. 【转】从零开始,让你的框架支持CocoaPods

    首先概括一个大概的步骤: 代码上传到Github 创建podspec文件 在Github上创建release版本 注册CocoaPods账号 上传代码到CocoaPods 检验是否上传成功 更新框架版 ...

  2. 在IntelliJ IDEA中添加框架支持时找不到Hibernate的解决办法

    问题描述 第一次在Add Frameworks support界面中添加hibernate支持的时候,异常中断,导致没有成功添加. 第二次进入Add Frameworks support窗口时,发现找 ...

  3. 读《架构探险——从零开始写Java Web框架》

    内容提要 <架构探险--从零开始写Java Web框架>首先从一个简单的 Web 应用开始,让读者学会如何使用 IDEA.Maven.Git 等开发工具搭建 Java Web 应用:接着通 ...

  4. MVC 插件化框架支持原生MVC的Area和路由特性

    .NET MVC 插件化框架支持原生MVC的Area和路由特性 前面开放的源码只是简单的Plugin的实现,支持了插件的热插拔,最近晚上偶然想到,原生的MVC提供Areas和RouteAtrribut ...

  5. 让python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE等请求

    这两天在用python的bottle框架开发后台管理系统,接口约定使用RESTful风格请求,前端使用jquery ajax与接口进行交互,使用POST与GET请求时都正常,而Request Meth ...

  6. 【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 ...

  7. CocoaPods学习系列2——使自己的项目支持CocoaPods管理

    该篇记录使自己的项目支持CocoaPods管理. 要达到这一目的,需要如下步骤: 1.将自己的项目提交到github,添加开源协议license 2.添加podspec文件 3.验证podspec,成 ...

  8. 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 ...

  9. .NET Core 多框架支持(net45+netstandard20)实践中遇到的一些问题总结

    .NET Core 多框架支持(net45+netstandard20)实践中遇到的一些问题总结 前言 本文主要是关于.NET Standard 代码 在多框架 和 多平台 支持自己实践过程中遇到的一 ...

随机推荐

  1. 基于Redis主从复制读写分离架构的Session共享

    1.搭建主从复制 第一步:将Redis拷贝到虚拟机上的指定文件夹内,此Redis作为主服务 第二步:将Redis拷贝到本机的指定文件夹内,此Redis作为从服务 第三步:修改主服务的配置文件(redi ...

  2. [转] shell字符串操作方法,以及实例

    每一种语言都有他独自的字符串操作方法,shell也一样,下面以以例子的方式,简单介绍常用方法. 1,取得字符串长度 string=abc12342341 //等号二边不要有空格 echo ${#str ...

  3. Hive表分区

    必须在表定义时创建partition a.单分区建表语句:create table day_table (id int, content string) partitioned by (dt stri ...

  4. Asp.Net生命周期系列二

    在上回书开始的时候我们提到博客园的IIS看了一眼我的请求后就直接交给ASP.NET去处理了,并且要求ASP.NET处理完之后返回HTML以供展示. 那么我们不仅要问: 1,    IIS肯定是没有眼睛 ...

  5. SQL Server 2008之数据库大型应用解决方案总结

    着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大型的互联网应用,每天百万级甚至上亿的PV无疑对数据库造成了相当高的负载.对于系统的稳定性和扩展性造成了极大的问题. 一. ...

  6. android 开发 获取各种intent (图片、apk文件、excel、pdf等文件)

    public static Intent openFile(String filePath){ File file = new File(filePath); if(!file.exists()) r ...

  7. CentOS7 安装 PostGIS方法(适合国内网络

    安装Postgresql 9.4 yum install http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-redhat94-9.4-1. ...

  8. 【BZOJ】【1529】 【POI2005】ska Piggy banks

    本来以为是tarjan缩点……但是64MB的空间根本不足以存下原图和缩点后的新图.所以呢……并查集= = orz hzwer MLE的tarjan: /************************ ...

  9. Leetcode#81 Search in Rotated Sorted Array II

    原题地址 如果不存在重复元素,仅通过判断数组的首尾元素即可判断数组是否连续,但是有重复元素的话就不行了,最坏情况下所有元素都一样,此时只能通过线性扫描确定是否连续. 设对于规模为n的问题的工作量为T( ...

  10. cookie中转注入实战

    随着网络安全技术的发展,SQL注入作为一种很流行的攻击方式被越来越多的人所知晓.很多网站也都对SQL注入做了防护,许多网站管理员的做法就是添加一个防注入程序.这时我们用常规的手段去探测网站的SQL注入 ...