首页 > ios > ios static framework的制作笔记

ios static framework的制作笔记

  开发了项目很多个了,也遇到了很多的经典,最好得把他们总结起来,以后复用。在网上找了很久,才发现一个好的方法。就是打成framework。但是在Xcode中只有打成静态库的模板。静态链接库用起来的颇为麻烦,libxml2就是一个例子,首先要加入linker内让linker找到符号,然后还需要配置Header让compiler可以找到这些符号的定义。基于这种不人性化操作,苹果在自己的平台上推出了一种新的引用方式,那就是Framework。

  Framework其实就是将Header及Library打包在一起方便使用,在苹果的官方文档,Framework还可以嵌套打包,其称为Umbrella Framework,不过其不建议普通用户这样做而已。我们平常使用的QuartzCore、UIKit、CoreFoundation等均打包为Framework。因为没有模板,所以不能简单地创建一个Framework,但是一个开源的模板项目可以帮到我们:iOS-Universal-Framework

  亲身体会的两个问题,看到的以后注意不要走我的后路。
  1.如果说项目中有arc 和 非arc 混合编译的话,就在文件在编译选项后面加上Compiler flag标识。
错误的截图
  2.这是最最注意的,折腾我到半夜的12点。
  就是在包里面的类别扩展打包后,放在项目中不识别。Unrecognized selector in (some class with a category method)
  还是开发文档没有读好的缘故啊!
  You will also need to add “-ObjC” to the “Other Linker Flags” build setting in any project that uses the framework.

  下面说说 Static Library、Fake Static Framework、Real Static Framework 使用需要注意的事项以及其优劣,特别是在Deployment Target 在 iOS 5.0以下时候容易出现的问题。

Static Library:

  简单的静态链接库,其使用Libtool生成静态链接库文件,不会因为开启iOS 4.0以下版本的ARC而强制将libarclite链接至静态链接库;但是,其使用较为麻烦,不方便发布。

  Static Library在生成的静态库时候会加上一个参数-arch_only armv7(使用模拟器时是:-arch_only i386),即使这个库只可用于模拟器或者真实设备,现在貌似暂时没有办法设置其同时支持armv7和i386。

Fake Static Framework:

  这个不是一个真正的Framework,实际类型是Core Foundation Bundle,所以叫做Fake Framework。

  其生成的目标是CFBundle,所以Xcode使用Ld命令生成目标静态库,这样在工程内的Link Binary with Libraries不能有系统的Framework和Library,一旦引入系统的库,Ld命令会将引入库的所有符号内联到当前工程中,当其它工程引用这个静态库的时候就会出现Duplicate symbol define的错误!

  基于这个原因,在Deployment Target低于5.0而且开启ARC的时候可能会出现Duplicate symbol define: objc_retainObject()的错误,出现这个错误的原因如下:

  1. Fake Static Framework使用Ld命令生成库,而不是使用Libtool生成库,当Framework工程的Deployment Target低于5.0而且开启ARC的时候编译器会向程序写入内存管理方面的代码,而Ld命令会将libarclite库内对应的函数(如objc_retainObject())的定义加入到当前的静态库中。

  2. 在引用Framework的工程中,如果Deployment Target低于5.0而且开启ARC,同1道理,Ld命令会向项目内引入libarclite库并将定义加入当前项目,但是由于在引入的Framework中已经包含有相关符号,所以会出现Duplicate symbol define。

  解决方案如下:在Fake Static Framework生成的时候将Deployment Target改为5.0或更高,在编写代码的时候将其改回对应版本(因为5.0以下的不支持weak关键字,改回低版本有利于IDE的提示);或者将引用Framework的工程的Deployment Target改为5.0或更高,但是这样则会失去对低版本的支持。

Real Static Framework:

  是一个真正的Framework,其生成的文件实际类型就是Framework。其内部包含的静态库是由Libtool生成的,所以不存在ARC的问题,而且可以在Link Binary with Libraries中加入系统的Framework,其只会在生成的库中加入对应Framework或Library的引用,而不会将定义也加入其中。

  但是,由于苹果的限制,Xcode不支持Real Static Framework直接引用,需要加入两个xcspec文件才可以使用,但是使用这个方式的Framework会将不会存在上述两个静态库的n问题,是现时来说最方便的库。
  我做的几个framework肯定用这个做的啦!

  1. sarenza 10月 21st, 2013 @ 17:28 | #1

    Thank you a lot for sharing this with all people.

评论提交中, 请稍候...

留言


可以使用的标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
Trackbacks & Pingbacks ( 0 )
  1. 还没有 trackbacks