Framework静态库制作方法

1、创建一个工程,或者在原有的工程上进行。不在列举。

2、在原有工程上添加一个静态库

2.1、选择OS X 的Bundle。因为Xcode6.1中iOS里没有Bundle。

2.2、修改Bundle的属性,一是让他能用在iOS上。二是改变Bundle成为Framework
选中要修改的Bundle

2.3、Target:并选择 Build Settings ->  Architectures -> Base SDK  改为Latest iOS(ios 8.1)

2.4、Target:在 Deployment 下,
将 “Mac OS X Deployment Target”改成”Compiler Default”,
将 “Targeted Device Family”改成”iPhone/iPad”,根据自己的需要改。如果你只想在iPhone上用,那选iPhone就行
将  “iOS Deployment Target”,改成 “iOS 7.0”:也就是说这个静态库支持7.0以上版本。

2.5、Target:在 Linking 下,
将 “Dead Code Stripping” 改为 “NO”,
将 “Link with Standard Libraries” 改为 “NO”,
将 “Mac-O Type” 改为 “Relocatable Object File”:
2016.2.29更新 :
以上的设置方法对于Xcode 7+版本已经不适合。Dead Code Stripping、Link with Standard Libraries无需在设置成NO。Mac-O Type建议设置成静态库(Static Library),如果必须使用动态库(Dynamic Library),建议查阅Apple 开发文档。
另外我发现一篇介绍IOS库的文章,非常好,很实用,我粘贴了过来,有兴趣朋友可以看下。
http://www.tuicool.com/articles/VFFjmq6

2.6、Target:Packaging 中,
将 “Wrapper Extention” 改为“framework”:

2.7、Target:返回Build Phases 标签。加入Copy Headers,后边会用到。

点开菜单,可以看到所有可管理的工程、静态库。
3.2:LineChart(App图标样式)是App 工程文件,选中这个运行(command+R 或command+B)意思是让工程导出或者测试运行可发布的应用程序(就是上线文件)。对应功能就不一一介绍了。
3.3:PZGLineChart(Bundle图标样式)是静态库。选中这个运行(只能运行command+B,不能运行command+R)意思是导出静态库,也就是自己的封装代码,用于共享给其他人。如果选中iOS Device运行(command+R),将会导出真机版本的静态库,如果选中iOS Simulator以下其他任何版本运行(command+R),将会导出模拟器的静态库版本。至于为什么这样,是因为真机的iOS和Mac系统中的虚拟iOS目录结构是不一样的,如果导错了,编译器会报错,“找不到指定文件。”

3.4:选中:Edit Scheme…:在这里管理所有工程文件、静态库、测试、发布等等的程序关系。
在这里,我们把刚才加入Framewor的导入,以便程序直接建立关系。

在这之前 需把库文件放进工程中

4、给静态库添加文件、xib、image....
直接介绍其属性:
1:不知道。没用过。等高手补充
2:程序文件放的地方:(*.m 、*.mm等),需要压缩保护的代码,只要放在这里的文件,都将被静态库压缩。使用静态库的一方是无法看到源代码的。
3:库文件放的地方,比如把其他的静态库、动态库压缩到这里。
4:资源文件放的地方,图片、音视频、xib、Images.xcassets、甚至是Main.storyboard(故事板);只要放到这里,都将被压缩,使用方是无法编译或者看到源代的。
5:对外接口。主要就是这里,展开后,会看到第一行(Public),不用介绍了吧,看英文应该就能猜到,何况这个单词是程序中常用的单词,公用吗!,只要是放到这里的文件,都将会暴露给使用方,建议把所有的*.h文件放到这里。

现在就把你想要管理的文件一个一个往里拖拽吧。就不在一个一个介绍。

6、首先测试,程序部分是否运行正常。我新增加了一个MyViewController(带.xib),在MyViewController.m里简单写了个打印。


  
 

还有我拖拽完就是这个样子:

7、选中模拟器或ios设备,分别command+B。

会分别生成模拟器和真机使用的framework

8、关于第三方库找不到文件的提示错误。简单补充下吧,别走弯路。
首先你要确定这个错误产生的原因:大致分两种,
一:你做的项目缺失文件,百度下,加入就解决了;
二:你引入的第三方框架发生找不到文件错误:这样的结果分两种:
二、一:开发第三方框架的程序人员没有做好自己的框架。尤其是在生成框架的时候,没有设置好自身属性。导致使用者用的时候出现找不到文件错误,最后迫使使用者不得不去改自己的工程配置。
二、二:你在引入第三方框架的时候,少引用了文件。

好了,你分析完后就好办了,我们做的这个静态库没有设置自己的兼容属性,所以就照成了这种错误。在iPad Retina的模拟器上跑就正常,换成其他的模拟设备就报错。所以改下其属性就能解决。
Target: -> Build Settings ->  Architectures -> Build Active Architecture Only 全改成NO;

真机版和模拟器版的库合并解决方法在framework文件夹下,你会看到一个白板文件,这个文件名和的的framework静态库名相同,只是没有后缀名。 这个文件在被引入到其他工程时候是看不见的。只有在Show In Finder下能看到。
打开终端,输入命令:中文换成你的真实目录。

lipo -create “……真机/目录/那个白板文件“ "……/模拟器/目录/那个白板文件" -output “…..另保存的/目录/文件”

合并好的新文件,覆盖掉原来的framework中的文件即可。这个framework就会支持所有设备和真机、模拟器全部版本。
其实这个方法就是用*.a文件的合并方法。在framework一样有效。framework中的白板文件就好像*.a文件一样。

9、关于xib的引用。同样根上边创建framework的方法一样,只是设置不同。我加了一个名字为:Resource.bundle静态资源文件。

Target:并选择 Build Settings ->  Architectures -> Base SDK  改为Latest iOS(ios 8.1)
Target:在 Deployment 下,
Target:将 “Mac OS X Deployment Target”改为”Compiler Default”,
Target:将 “Targeted Device Family”改”iPhone/iPad”,
Target:将 “iOS Deployment Target”,改为 “iOS 7.0”:

9.1、在MyViewController.m文件中编写下。别忘了在*.h里写上接口。

9.2、然后就是给新加的资源文件拖拽下。

command+B 之后将文件复制出来 就可以使用了。

原文地址:https://www.cnblogs.com/zhangz-1511/p/5403761.html