给CCTrendCharts类库加上CocoaPods支持的有趣经历
文档更新说明
- 最后更新 2020年02月26日
- 首次更新 2020年02月26日
前言
早在两三年前我就看过用CocoaPods托管类库的文章, 当时看别人写的一大堆内容, 自己也没有什么特别需要托管的类库, 所以一直没创建过, 其实今天回过头来看这些文章, 感觉有些时候是写得太复杂了, 本身创建Pods类库就是一件非常简单的事情.
最近公司APP做了一个全新的版本, 其中有一个新的图表界面, 我就把之前自己开发的objc类库CCTrendCharts
放进去, 取代了swift版本的Charts
, 接着就遇到了一连串的坑, 后面花点时间直接把类库放到Cocoapods
上去, 毕竟之前一直用的Cocoapods
, 自制的Cocoapods
类库体验了一番之后, 写下了这篇文章记录一下.
直接集成类库遇到的问题
指令集问题
题外话, framwork类库分为动态库和静态库, 严格上讲iOS目前只能支持静态库, 但是官方也提供了一种伪动态的支持, 制作framwork的时候, 可以在Build Setting –> Linking –> Mach-O Type里面找到类库的类型, 我设置的是Dynamic Libary. 当然使用这种类型打包出来的类库是动态库, 引入到工程里面之后, 必须在对应的targer的general里设置类库为Embed, 否则程序运行的时候会提示找不到镜像文件
1 | dyld: Library not loaded: xxxx |
一开始我是直接把CCTrendCharts
类库打包成framwork, 直接集成进项目里, 过年前一直是在公司写代码, 用的测试机和模拟器开发, 所以类库编译的时候柔合x86_64
和i386
指令集.
1 | Architectures in the fat file: CCTrendCharts are: i386 x86_64 armv7 arm64 |
后面春节遇到武汉肺炎, 接着就开始在家办公, 我没带电脑的转接器回老家, 所以只能用模拟器调试, 后面版本上线发布到苹果商店的时候, 就开始遇到第一个坑了, xcode老是提示打包失败, 折腾一番之后查到IDEDistribution.standard.log
提示CCTrendCharts
里面包含了X86_64的指令集, 所以打包失败了.
1 | /var/folders/p3/00n1b8h97cvcdwrv12lxw16h0000gn/T/IDEDistributionOptionThinning.~~~7jpElK/Payload/FlowMinerEnterprise.app/Frameworks/CCTrendCharts.framework/CCTrendCharts: |
所以我只能在打包的时候就执行下面指令, 把无关的指令集移除, 然后在模拟器开发的时候又把没移除前的二进制文件放回去, 好傻.
1 | lipo -remove i386 CCTrendCharts -o CCTrendCharts |
版本依赖问题
暂时解决了指令集问题, 很快又遇到第二个坑了. 我之前也写过一个便捷的KVO类库, 名字是CCEasyKVO
, 里面有一个私有类CCInternalObserver
, 这个类库在CCTendCharts
中有用到. 当我在APP工程里也引入CCEasyKVO
的时候, 问题就出现了, 提示我出现重复的标记:
1 | duplicate symbol '_OBJC_CLASS_$_CCInternalObserver' |
然后我就只能把CCTendCharts
中的类名改成CCInternalObserver_CCTrendCharts
, 避开了这个冲突, 这个也是很傻.
使用CocoaPods托管
要解决上面的两个问题, 应该有多种方法, 比如我一开始想到用shell脚本, 编译的时候自动移除指令, 编译好再加回来之类的, 不过感觉好复杂, 后来就想到把这两个类库都放到CocoaPods
上, 简单方便一劳永逸.
网上有很多文章介绍如何集成创建CocoaPods
仓库, 这里我就不重复说了, 随便搜索一篇看看就可以了, 下面简单记录一下我用到的指令
1 | pod lib create 项目 #创建了一个Pods仓库模板, 不是必须的 |
这里主要记录一下我使用的最新版本1.9.x出现的一些区别. 现在新版的”CocoaPods”客户端, 默认都是采用”trunk repo”的CND类型的仓库, 使用这个仓库对于大陆朋友来说, 有一个最坑的地方就是他被墙了, 刚好春节回家那段时间, 全部vpn都被封了, 这个也是太惨了, 一开始pod install都无法执行.
题外话, 新版的Pods客户端默认会强制添加trunk仓库, 输入trunk repo就可以看到.
1 | master |
如果是首次从老版本升级或者新安装的Pods客户端时, 执行pod install的时候默认会一直卡在添加trunk repo的地方
1 | [!] CDN: trunk Repo update failed - 17 error(s): |
这个只能开个vpn解决, 或者在自己的Podfile文件中指定原来的默认源master, 这个网上也有好多文章, 找一下就有了.
然后把仓库配置文件CCTrendCharts.podspec
通过pod trunk push指令上传后, 执行pod setup
, 删除了search_index.json
, 在执行Search命令的时候还是搜索不到仓库, 但是在另一台电脑上却搜索到了. 后面通过pod repo update
指令解决了这个问题.
还有一个地方上面没有提到, 就是配置依赖库, 这一步很重要, 这样在App中或者是CCTendCharts
类库中都能轻松使用CCEasyKVO
库了. 先为CCEasyKVO
类库创建好Pods并上传后, 在.pospec文件里, 增加下面配置即可.
1 | s.dependency 'CCEasyKVO' |
结语
将类库都做成Pods库后, 不管是真机还是模拟器还是打包上传到商店, 都不需要再担心指令集问题了, 也不用担心代码依赖问题, 而制作Pods仓库是一件非常简单的事情, 所以算是小投入大收益吧. 后面有时间和心情的话, 我打算整一下iOS的自动化打包发布, 给项目加一下自动化打包管理功能, 这样就不用手动打包文件上传测试平台给测试组同事用那么麻烦了.
最后放上CCTrendCharts
类库做出来的柱型图, 感觉还是挺好看的, 希望能有更多star, 我看Charts都有2万star啊 : )