.framework类型的静态库和.a类型的静态库各有优缺点。.framework类型的静态库使用方便,一包在手万事我有,但是会出现zip压缩后解压头文件丢失。.a类型的静态的有点是zip压缩不失真,可以按照你的需要要提供给用户头文件,不需要删除含安全信息的头文件。缺点是它不包含头文件和bundle资源文件,bundle资源文件要自己另外制作,需要你另外提供给用户。
注意:WinRAR是一个32位的程序,当mac升级到64位最新操作系统后,WinRAR无法使用。
上周我发布了一个SDK测试.framework的包,压缩为.zip后发到微信群里,结果别人解决后发现头文件的文件夹为无法识别的二禁止文件。对外接口文件不翼而飞。
强制打开是这个样子:
而压缩为zip格式前的文件夹是这样的:
真是伤心的悲剧了。分析他们的文件结构
打包的TELock.framework文件把所有头文件都给包含进来了,这是不安全,使用SDK的可能通过引入你头文件调试出你的函数逻辑。所以我只能给用户提供指定的头文件,其它头文件要删除。所以我们只保留ELockSDKSingleObject.h,BLSErrorCodeKeys.h文件和ELSBaseEntity.h头文件,其它文件都要删除。并且发现Headers,Resources,ELock和Versions下的Current等为超链接文件或文件。删除Headers的头文件,Versions下的A文件下的Headers文件夹下的文件也同时减少,Versions下的Current文件下的Headers文件夹下的文件也同时减少。说明三者下的文件实际只有一份物理文件,他们是超链接。
当采用zip压缩时,它是有损压缩,就把这种超链接结构破坏了。
如何解决呢?就是采用无损的.rar格式压缩。而mac电脑默认是zip压缩,只有rar解压缩,没有.rar压缩工具。所以要我们自己安装WinRAR,见Mac电脑如何使用WinRAR。当然你也可以采用丁丁或qq进行文件夹传送发给windows电脑,在windows电脑上进行rar压缩。
能不能有更彻底的解决办法啊?当然有了。
你打包成.a格式的包,把这个.a格式的包和你想公开的头文件发给用户,用户就能用了。.a格式的包是二进制文件不存在压缩失真问题。
.framework类型的静态库和.a类型的静态库的优缺点
1.a包需要你提供.a包,头文件,资源文件,使用这需要同时导入.a包,头文件和资源文件,就是使用者稍微麻烦些,不存在经过windows电脑采用zip压缩后发给别人解压不会出现问题。
2…framework包需要你手动删除不想让看到的头文件,使用者只需要导入.framework包就能看到头文件,正常使用。当然你忘记删除敏感的头文件就是严重的信息泄漏了。简言之就是发布包的做的事情多些,使用包的人只需要它拖入一个包就可以了。.framework因为存超链接,所以在windows用zip压缩再在其它电脑解压,这种超链接被破坏不能使用。当然你可以压缩无损的.rar包规避这个问题。
.a与.framework的区别:
一、库:
库是共享程序代码的方式,一般分为静态库和动态库
二、静态库与动态库的区别:
静态库:连接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。
动态库:连接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。
三、iOS静态库形式和动态库形式:
静态库:.a和.framework
动态库:.dylib和.framework
四、framework静态库和动态库的区分:
系统的.framework是动态库,我们自己建立的.framework是静态库
五、.a和.framwork的区别:
.a是一个纯二进制文件,.framework中除了有二进制文件外还有资源文件。
.a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用。
.a + .h + sourceFile = .framework
你的SDK想生成那种类型的包,自己衡量利弊字节决定。福兮祸所伏,祸兮福所倚!