文章目录
  1. 1. 文档更新说明
  2. 2. 前言
  3. 3. 直接集成类库遇到的问题
    1. 3.0.1. 指令集问题
    2. 3.0.2. 版本依赖问题
  • 4. 使用CocoaPods托管
  • 5. 结语
  • 6. 推荐阅读
  • 文档更新说明

    • 最后更新 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, 否则程序运行的时候会提示找不到镜像文件

    dyld: Library not loaded: xxxx
    Reason: image not found

    一开始我是直接把CCTrendCharts类库打包成framwork, 直接集成进项目里, 过年前一直是在公司写代码, 用的测试机和模拟器开发, 所以类库编译的时候柔合x86_64i386指令集.

    Architectures in the fat file: CCTrendCharts are: i386 x86_64 armv7 arm64

    后面春节遇到武汉肺炎, 接着就开始在家办公, 我没带电脑的转接器回老家, 所以只能用模拟器调试, 后面版本上线发布到苹果商店的时候, 就开始遇到第一个坑了, xcode老是提示打包失败, 折腾一番之后查到IDEDistribution.standard.log提示CCTrendCharts里面包含了X86_64的指令集, 所以打包失败了.

    /var/folders/p3/00n1b8h97cvcdwrv12lxw16h0000gn/T/IDEDistributionOptionThinning.~~~7jpElK/Payload/FlowMinerEnterprise.app/Frameworks/CCTrendCharts.framework/CCTrendCharts:
    Mach header
    magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
    MH_MAGIC_64 X86_64 ALL 0x00 DYLIB 22 3416 NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS

    所以我只能在打包的时候就执行下面指令, 把无关的指令集移除, 然后在模拟器开发的时候又把没移除前的二进制文件放回去, 好傻.

    lipo -remove i386 CCTrendCharts -o CCTrendCharts
    lipo -remove x86_64 CCTrendCharts -o CCTrendCharts

    版本依赖问题

      暂时解决了指令集问题, 很快又遇到第二个坑了. 我之前也写过一个便捷的KVO类库, 名字是CCEasyKVO, 里面有一个私有类CCInternalObserver, 这个类库在CCTendCharts中有用到. 当我在APP工程里也引入CCEasyKVO的时候, 问题就出现了, 提示我出现重复的标记:

    duplicate symbol '_OBJC_CLASS_$_CCInternalObserver'

    然后我就只能把CCTendCharts中的类名改成CCInternalObserver_CCTrendCharts, 避开了这个冲突, 这个也是很傻.

    使用CocoaPods托管

      要解决上面的两个问题, 应该有多种方法, 比如我一开始想到用shell脚本, 编译的时候自动移除指令, 编译好再加回来之类的, 不过感觉好复杂, 后来就想到把这两个类库都放到CocoaPods上, 简单方便一劳永逸.

    网上有很多文章介绍如何集成创建CocoaPods仓库, 这里我就不重复说了, 随便搜索一篇看看就可以了, 下面简单记录一下我用到的指令

    pod lib create 项目 #创建了一个Pods仓库模板, 不是必须的
    pod trunk me #查看当前帐号
    pod lib lint #本地验证类库是否符合要求
    pod trunk register 邮箱 '用户名' --description='描述信息' #没帐号的先注册帐号
    pod trunk push CCTrendCharts.podspec #把仓库配置文件上传给Cocoapods官方的大仓库
    pod setup #更新本地大仓库
    pod reop update #也是更新本地大仓库
    rm ~/Library/Caches/CocoaPods/search_index.json #删除老的所以文件, 这样才能找到search自己刚发布的类库

    这里主要记录一下我使用的最新版本1.9.x出现的一些区别. 现在新版的”CocoaPods”客户端, 默认都是采用”trunk repo”的CND类型的仓库, 使用这个仓库对于大陆朋友来说, 有一个最坑的地方就是他被墙了, 刚好春节回家那段时间, 全部vpn都被封了, 这个也是太惨了, 一开始pod install都无法执行.

    题外话, 新版的Pods客户端默认会强制添加trunk仓库, 输入trunk repo就可以看到.

    master
    - Type: git (master)
    - URL: https://github.com/CocoaPods/Specs.git
    - Path: /Users/cocos/.cocoapods/repos/master
    trunk
    - Type: CDN
    - URL: https://cdn.cocoapods.org/
    - Path: /Users/cocos/.cocoapods/repos/trunk
    2 repos

    如果是首次从老版本升级或者新安装的Pods客户端时, 执行pod install的时候默认会一直卡在添加trunk repo的地方

    [!] CDN: trunk Repo update failed - 17 error(s):
    CDN: trunk URL couldn't be downloaded: https://raw.githubusercontent.com/xxx/xxx.podspec.json, error: Operation timed out - SSL_connect

    这个只能开个vpn解决, 或者在自己的Podfile文件中指定原来的默认源master, 这个网上也有好多文章, 找一下就有了.

    然后把仓库配置文件CCTrendCharts.podspec通过pod trunk push指令上传后, 执行pod setup, 删除了search_index.json, 在执行Search命令的时候还是搜索不到仓库, 但是在另一台电脑上却搜索到了. 后面通过pod repo update指令解决了这个问题.

    还有一个地方上面没有提到, 就是配置依赖库, 这一步很重要, 这样在App中或者是CCTendCharts类库中都能轻松使用CCEasyKVO库了. 先为CCEasyKVO类库创建好Pods并上传后, 在.pospec文件里, 增加下面配置即可.

    s.dependency 'CCEasyKVO'

    结语

      将类库都做成Pods库后, 不管是真机还是模拟器还是打包上传到商店, 都不需要再担心指令集问题了, 也不用担心代码依赖问题, 而制作Pods仓库是一件非常简单的事情, 所以算是小投入大收益吧. 后面有时间和心情的话, 我打算整一下iOS的自动化打包发布, 给项目加一下自动化打包管理功能, 这样就不用手动打包文件上传测试平台给测试组同事用那么麻烦了.

    最后放上CCTrendCharts类库做出来的柱型图, 感觉还是挺好看的, 希望能有更多star, 我看Charts都有2万star啊 : )

    推荐阅读

    CCTrendCharts仓库地址
    CCEasyKVO仓库地址

    文章目录
    1. 1. 文档更新说明
    2. 2. 前言
    3. 3. 直接集成类库遇到的问题
      1. 3.0.1. 指令集问题
      2. 3.0.2. 版本依赖问题
  • 4. 使用CocoaPods托管
  • 5. 结语
  • 6. 推荐阅读