iOS 静态库SDK制作过程嵌套第三方静态库

来源:互联网 发布:xbrower连接linux桌面 编辑:程序博客网 时间:2024/06/06 16:29

 iOS 静态库SDK制作过程嵌套第三方静态库


公司需要在静态库sdk里面添加微信支付,支付宝支付,做成接口模式,给别人去使用,整个过程中呢各种问题不断,那么下面我挑一些比较突出的问题和大家分享,希望能够帮助到有需要的人,因为自己在研究的过程也是想得到一些帮助,哈哈闲话不多说,让我们直奔主题!

一,相关概念

1.静态库的形式有.a.framework,类似于支付宝AlipaySDK.framework 这个库呢,其实是属于第三方静态库,AlipaySDK的头文件直接包含在framework里面;

在里面有个bundle文件,这个文件是资源文件都打包放在这里(图片之类的资源)。在制作Framework的时候不可以把图片直接放在项目中,否则制作好之后图片是一张一张的出现在项目中非常乱,需要新建一个bundle将图片放进去,这里的bundle提供整个SDK的图片资源。使用setImage:[UIImageimageWithContentsOfFile这一种方式访问图片;



那么微信的libWeChatSDK.a 这个也是属于第三方静态库,.a是一个纯二进制文件,至少要有.h文件配合才能正常使用,相对于支付宝的.framework文件可以直接使用,比较方便


2.动态库的形式: .dylib/.tbd.framework

framework为什么既是静态库又是动态库?

系统的.framework是动态库,我们自己建立的.framework是静态库。


,静态库的制作

动态库与静态库的制作流程基本一样,包括头文件的暴露等,唯一不同的是Mach-O Rype文件的勾选方式。


本节将介绍Xcode制作Framework的过程,本次制作的Framework静态库依赖其他第三方静态库Framework

我按照之前的方式,勾选Framework



然后添加需要的AlipaySDK  第三方静态库 ,接着添加支付宝需要的第三方依赖库,添加的libz.tbd 和libc++.tbd动态库过程中报错:




这个原因呢是因为静态库里面没法这样直接添加.tbd动态库,静态库项目没法找到对应的.tbd动态库文件,然后百度,参考一下大神的方式:先把原来的.tbd删掉,然后再次添加,这个时候选择add other,在弹出的窗口中按快捷键shift + command + G调出finder的前往窗口,输入/usr/lib,然后添加相应的dylib动态库,非常不幸报下面的警告:




好吧,还是同样的道理,静态库没法添加.tbd动态库文件 ,那么支付宝的sdk就没法正常使用了.


该怎样解决这个问题呢 ??????? 只能看博客,百度,谷歌  统统查了几遍~~~只能说网络上面的资源很多很强大,这要看自己怎么筛选.

某天上厕所想起之前有个博客说过:静态库里面是没法包含第三方静态库,我当时就纳闷:静态库为什么不能包含进去到静态库里面呢 ?看了答案才知道:静态库是不能真正的包含静态库的,它不像动态库,那个导入实际是链接,第三方静态库还需要以依赖库的形式提供给外界。动态库不存在这样的问题!!!


那么要是这样的话,那么上面我静态库里面无法添加支付包sdk依赖库的问题就能解决了;我解决的思路是:可以把支付宝的sdk另外放出来,不要打包进自己的静态framework,让用户自己手动添加支付宝的sdk就好了(虽然不优雅),果然打包成功了接着把我制作成功sdk静态库提供给外界使用的过程中会出现报.h文件找不到的错.


我就纳闷了,我做个静态库包含支付宝支付,我得罪谁啦,整那么多坑出来~~~我抱着死磕到底的精神,我就不信弄不出来的斗志,继续爬坑~~

让我们整理一下思路:

首先,把支付宝的sdk另外放出来,不要打包进自己的静态framework


接着添加(第三方静态库需要的依赖系统库都由用户那边使用我静态库的时候再添加对应的依赖库)



然后在aggregate 里面—>Build Phases—>添加自定义 合并真机和模拟器run script  (当时也想把支付宝的第三方静态库在里和我的静态库合并一起的,但失败—>这里如果有大神成功的话劳烦告知一下,感激不尽!)

最后command +b 生成sdk静态库;准备给外界使用,如果在这里不做处理的话,直接让外界导入我们的sdk和支付宝的sdk 很可能又出现"_OBJC_CLASS_$_AlipaySDK", referenced from:”这个错误:外界使用的过程中link不到这个库,那么如果新建一个文件夹,将制作好的静态库拷贝出来放进去,再将支付宝的第三方静态库拷贝到相同的文件夹中,此时只要将这个文件夹提供给外界使用,让他们直接拖这个文件夹进入到项目呢? 测试了一下,果然有效.

首先,静态库都放在同一个文件夹中,给外界使用



目录架构


 

接着到外界使用的过程了,他们只需要拖这个文件夹进入到自己的项目,然后在build phases 里面添加上相关的依赖库:



外界项目调用sdk的接口文件,完美调起支付宝界面~~~~


结语:很早之前就想过自己写一个博客,以为思路所到就能够文笔生花,这想法很幼稚,真正开始写的时候,问题多多,大家看的时候,如果觉得有问题可以留言!!!







0 0
原创粉丝点击