静态库形式的组件化

上一篇写了一下常规的组件化方式,但是我发现那一种形式在面对OC,swift混编的私有库时问题多多,我接触swift的时间不算很长,在swift的项目中如果使用OC的代码,需要在一个叫做Bridging-Header的文件中声明OC的头文件,但是如果建立私有库就不能使用这种文件,虽然网上很多文章给出了解决办法,但还是有很多预想不到的问题出现,后来试了一下使用静态库的形式来进行组件化部署,之前遇到的奇奇怪怪的问题都不见了,所以在这里推荐大家使用静态库的形式来进行组件化开发,而且据我所了解,现在很多大厂都在使用动态库或静态库的形式来进行组件化开发,这个还是看不同公司的业务需要吧。
好了下面我们就开始静态库的组件化部署吧,我还是用在腾讯开放平台的私有库来进行演示,开始还是一样的步骤,建立一个新的项目。
静态库项目
通过项目地址clone到本地的空文件夹
clone至本地
接下来的操作就稍稍的不太一样了,使用终端CD到刚刚建立的文件夹下面,输入如下代码pod lib create ZRTestFramework,名字就是你私有库的名称,以后pod的时候也会用的名字,根据终端提示一步步根据你的需求输入。
根据问题输入你想要的方式
成功之后Xcode会自动打开,文件目录结构如下图,一般我们会将封装好的代码放在classes中,而我们的项目配套Demo在Example文件夹下。
我们先来编写podspec文件,打开Example中的workspacepodspec在如下图的位置,我们对其进行编写,特别说明一下,一定要指定swift版本,我是这个东西的资深受害者,再次奉劝大家一定要写上。
编写podspec文件
然后我们CD到Example文件夹路径下执行pod install来对我们的Demo工程进行配置,这一步的目的是,假如我们将要加入私有库的代码有些用到了三方库,我们先pod下来,以防到时候加进来找不到三方库然后报错。
现在我们将想封装的代码加入到Classes文件夹,然后加入到工程中,注意加入的位置是在pod
添加封装好的代码
这时我们就要说到最一开始说到的问题了,swift项目如果想使用OC的类,要使用桥接文件,但是在私有库中我们不会去建立这个桥接文件也就是Bridging-Header,在私有库中是使用一个结尾名字为umbrella的文件来实现混编的,这个文件不用我们去创建,也不用我们去编写
私有库中的桥接文件
既不用自己生成,也不用自己去编写,那么要怎么用呢,我们需要把OC类的头文件暴露出来,设置为public
20190515101048.jpg
然后我们编译一下这个framework,然后再次CDExample中,执行pod install,成功之后重新打开workspace,我们再来看看这个umbrella文件
自动生成import代码
已经自动的#import了两个public头文件,这时在swift中就可以使用这两个OC的类了,这时我们需要找到编译成功生成的framework,并且把它的位置做个小小的调整,将它移动到与podspec文件相同的目录下面。
这时我们需要再次修改一下podspec,添加这一句代码s.ios.vendored_frameworks = 'ZRTestFramework.framework'指定项目所依赖的framework,也就是我们自己生成的framework,这样在别的项目中pod时,才会将我们的生成的framework导入。
然后我们再次cd到Example中执行pod install,然后重新打开workspace,你会发现目录中多了一个文件夹,没错,这个就是我们的framework
接下来我们就用sourcetree或者终端将我们的代码push到远端,push成功之后的操作,就和上一篇的操作一摸一样啦,打tag本地校验远程校验push podspec文件
校验成功
我们随便找一个项目来pod一下刚刚弄好的静态私有库,记得先pod repo update
我们就可以直接在项目中来直接使用这个framework了,如果我们的framework中使用了xib文件,那我们就要换个方式在项目中使用,之前很多人都会使用配套的bundle,但是我在网上查资料发现了更好的办法
 _collectionView.register(UINib.init(nibName: "DeviceControllCell", bundle: Bundle.init(for: self.classForCoder)), forCellWithReuseIdentifier: "DeviceControllCell")
直接在bundle的位置填上Bundle.init(for: self.classForCoder)即可,当然如果是图片的话,大家把图片的xcassets文件添加到Assets文件夹下,然后我们再将这个文件夹拖出来到podspec相同目录下(纯属个人习惯),然后更改podspec文件。
然后我们再cd到Example中进行pod install,当然,图片的显示方式也是要更改一下,这些图片就已经在项目中可以显示了。
cell.swithBtn.setImage(UIImage.init(named: "unselected", in: Bundle.init(for: self.classForCoder), compatibleWith: nil), for: .normal)
其实是和获取xib是一样的,至此framework的组件化形式就是这样,对了,还忘说了一点,提到了很多次Example这个文件,这里面放着的是我们私有库配套的Demo工程,大家可以在demo中引用我们封装好的私有库代码来查看效果。以后发现新问题我会及时更新,有不懂的同学请及时评论我,或者我说的哪里不对也请各位来及时纠正我,以免我误导了大家

你可能感兴趣的:(静态库形式的组件化)