iOS静态库与Cocoapods往事(缘续)

缘续

这此打算生成静态库也同时托管到Cocoapods上管理,这样以后更新维护也方便一点

Cocoapods是啥?这个大家可以自从百度一下,网上相关的介绍已经太多了,这里就不赘述了

工欲善其事 必先利其器


R.I.P.gif

工具版本号:
Cocoapods: 1.9.1
Xcode: 11.7

这样的首先先来Github上创建一个仓库

Github仓库

在这里呢,我在想一个问题,我们的Github仓库是建Public还是Private呢?如果是Private的到时候上传Cocoapods的时候会不会出现问题呢?
这边就像留个疑问这里后面再试一下

命名一直是令程序员头疼的问题,我取名Labrador(拉布拉多)正好有看门狗的含义,帮助我们守住内心的底线......又扯远了

创建本地工程

远程仓库有了,接下来就是创建一个本地的静态库项目关联到Github仓库上了

大家可以选择直接Xcode手动创建一个静态库项目,这种方式的在这里也不多赘述了,因为网上相关的资料是在太多了

因为之后是会打算把生成的静态库托管到Cocoapods上的,所以直接使用

pod lib create XXXX

直接使用Cocoapods的静态库模板创建,方便又省心
Just Do IT!


Cocoapods创建静态库项目

此时我们只要耐心等待就行,一会儿会出现几个拷问灵魂的问题


Cocoapods创建静态库项目2.png

大家根据自己的实际情况填写就行了

接下来我们可以先看一下Cocoapods模版创建的项目的文件目录结构,都有些啥


目录结构

这里我们就看主要会涉及到的

  1. Example:使用Cocoapods模版的时候会询问是够是要一起创建个Example工程,这个不用想一般肯定要啊,不然写出来的代码难道还要新建工程测试吗?
  2. Labrador_swift:当然这个是我这这边的命名,这个文件下面就是存放的静态库里面具体的功能的代码了, 里面还有两个文件夹AssetsClasses顾名思义 一个是放资源文件的,一个是放代码文件的
  3. Labrador_swift.podspec:这个其实就是一会上传Cocoapods的使用到的配置文件,里面涉及的内容非常多,当然我们这次需要使用的就几个,更多的内容大家可以自行百度哈

本地工程和远程仓库关联

本地工程先随便来个commit

这边有个地方要注意,提交代码的时候,最好在项目的根目录上,如果在子文件下的话,gst的话可以看有待提交的文件,但是git add .就是添加不上去,一般工程的名字和里面静态库代码的文件夹的名字是一样的,一不留神就搞混了

commit好了之后,二货不说直接git push 当然肯定是推不上去的

git push.png

有这些提示就简单了,依葫芦画瓢呗


添加远程仓库地址

推送分支.png

OK, 到这一步本地工程就已经推送到远程仓库了
刷新一下Github 会发现仓库已经有内容了


Github仓库.png

工程配置修改

到这里如果大家觉得就可以开开心心的撸代码了
那你就中计了,Too Young Too Sample!

Cocoapods模版创建出来的不是静态库而是动态库,而且Architecture模式也要修改
至于动态库和静态库的区别差异,又到了大家自己动手丰衣足食的环节了
动态库笔者试了一下也是可以满足我们的需求的,不过老话说的好
千年王八万年,所以我选择了静态库 哈哈哈~~~~

  1. 修改工程配置为静态库
    打开Example目录下的workspace工程,选中Pod工程中的Labrador_swift target
    然后Build Settings中搜索Mach-O Type,你会看到
    Xcode.png

默认选中的是Dynamic Library这个就是动态库的意思,我们切换成Static Library

  1. 修改Architecture模式
    同样在上述的Build Settings中搜索Architecture,你会看到
    Xcode.png

有个Build Active Architectures Only选项,这边有两个DebugRelease两种模式,默认Debug是Yes,Release是No
这是个什么意思呢?
其实就是你构建的静态库支持的架构,如果配置的No,就是构建的静态库会支持所有的架构,配置Yes的话,就只会构建当前选中的架构,比如你选择模拟器是iPhone 11 Pro那么就会构建只支持iPhone 11 Pro架构的静态库
具体的细节在后面我们成功构建出静态库的时候再详说
其实这边的Build Active Architectures Only选项可以不用修改,一般我们打出来的静态库也基本都是都Release版本,所以Release已经是支持所有架构的配置,我们就不用在多次一举的修改了,就这样吧

Coding

接下来就可以先写点测试代码了
静态库的代码之后放在ExampleClasses文件下就可以了
在代码文件夹Labrador_swift文件(Labrador_swift是我这边的文件夹命名,大家命名肯定都不一样)下会看到一个ReplaceMe.swift文件,这个是模版生成时候自动生成的文件,之后可以删除掉

测试代码.png

我这边新建了一个Test对象,写了一个func es_p() 的测试打印方法

接下来可以先去Example的Demo中测试一下

测试代码.png

成功打印
接下来就是打包静态库了

打包静态库

大家如果有查阅过Cocoapods发布静态库相关的资料,一定会查到一个插件工具cocoapods-packager
查下来说是一行脚本就是实现打包静态库功能
但是我没有使用的原因很简单
因为跑脚本没有成功过,花了不少时间研究,还是没有成功,只能哭晕在厕所
所以要是哪位大哥知道cocoapods-packager正确使用姿势,还望教教小弟

官断十条路
条条大路通罗马
插件不行就手动操作

首先先要找到打出来的静态库在哪里


静态库.png

没错是他、是他、就是他

在打包之前,首先有个地方要注意

静态库打包的话打Realse版本的

静态库分为真机、模拟器两个包

真机:只支持真机的架构
模拟:只支持模拟器架构

如果想要自己的静态库框架真机、模拟器都支持的话,两种架构的静态库到时候需要合并成一个
模拟器架构:i386、x86_64
真机架构:armv6、armv7、armv7s、arm64

话不多说,先打出真机、模拟器两个版本的静态库再说
直接选择Realse,分别选择任意一个模拟器和Generic iOS Device分别编译一下就行
Generic iOS Device模式下需要自行配置一下签名证书啥的
每次Build之前最好clean一下

静态库.png

直接右击Show in Finder

静态库.png

不出意外的话,分别选择真机和模拟器编译之后,你会看到这两个打包出来的静态库

接下来就是合并静态库

合并静态库

凡事不要急,先看看啥情况
现在我们有两个静态库了,看文件夹的名字也能判断哪个是真机的,哪个是模拟器的


静态库.png

图片中框出来的就是静态库本体,一会要合并的就只这个

首先我们可以通过lipo -info XXX先查一下这个静态库的信息

静态库信息.png
静态库信息.png

可以看到一个是真机架构、一个模拟器架构

接下来就让他们合体
lipo -create 模拟器静态库路径 真机静态库路径 -output 合并库的输出路径

合并静态库.png
合并静态库.png

合并静态有两个小坑让我抽半包烟

  • 合并的出来的静态库的命名要和之前编译出来的静态库的命名一样,不然使用的时候会报找不对文件错
  • 合并出来的静态库名字就不要加文件类型后缀了

接下来通过file命令
查一下库是不是静态库

静态库信息.png

看到这样的current ar archive random library 字样就说明是静态库了
如果是动态库的话会看到Dynamic的字样

现在合并的静态库已经有了
但是!!!
不是直接使用这个合并出来的库,还有一些头文件、配置文件啥的,不然在其他项目中使用还是报找不到文件的错
那头文件、配置文件在哪里呢

其实也很简单,我们再看一下刚才打包出来的真机静态库的文件夹


真机静态库文件夹.png

直接把这里的Labrador_swift替换成刚才的合并出来的静态库,然后再把模拟器静态库文件夹中一些文件Copy过来就行了

模拟器静态库文件夹.png

就是把这里的文件Copy到真机静态库文件下相同路径的位置下


合并之后的文件.png

合并之后长这个样子

接下来我们要用的就是


终极静态库.png

洗洗手,准备上传Cocoapods了

上传Cocopods

上传Cocoapods的准备工作就不介绍了
我们现在回到Labrador_swift这个项目
先把刚才的静态库拷贝到项目目录下,放的位置要注意好,因为一会配置podspec的时候要用

项目目录.png

接下来开始编辑podspec

podspec.png

一些常见的配置属性就不说了
说几个关键的

  • vendored_frameworks:这个地方配置刚才导入到项目中的静态库的相对路径,我的放在根目录上
  • pod_target_xcconfig:如果不配置,pod校验的时候会报错
  • source_files:要注释掉,不然被人pod install的时候还是会把源代码拉下来的

万事俱备 只欠东风

推代码、打tag,从此走上人生巅峰
先来pod lib lint一下,这里校验的时候要加上--skip-import-validation 不然会报错

校验.png

校验没有问题

二话不退,发布Cocoapods


发布.png

oh yeah~~~ 发布成功

来来来,搞个新项目测试一下,激动人心的时刻终于到了

  • pod install 成功
  • 框架引入成功
  • 测试类创建成功
  • 打印日志成功
测试.png

收工~~~~~

想的美,还有两个问题等着我们
1.还有一个就是我们重新进入工程的Example文件下,pod install运行一切正常,但是Pod工程下也变成静态库了,WTF!!!那怎么编辑修改??

  1. 就是我们刚才说的如果github仓库是private的会是什么情况

凡事不要慌,我们一件一件的来解决
第一个问题,Example项目的podfile中引用的静态库也是跟着之前配置的podspec文件来的,所以想看到源码,只要把source_files 打开 pod_target_xcconfigvendored_frameworks注释掉,重新pod install一下就OK了,又可以愉快的撸代码了
还有就是之前把Scheme改成了Release记得再改回成Debug

第二个问题:直接把GitHub仓库改成Private的,再发布个版本一试便知

似有库.png

额,果然报错了,这么看来是不行的,确实是的似有库项目想发布给外界用,确实理论上就有冲突,那咋搞万一别人通过我的github找到源码,前面搞那么多不久白忙活了吗?
后来想了想,暂时就先通过ignore把静态库的源代码文件夹忽略掉,不提交就行了,有面有什么好方面再尝试一下

你可能感兴趣的:(iOS静态库与Cocoapods往事(缘续))