简述iOS开发framework制作与使用

前言

  • 我的第一次,请多多指教!目的是给予有需要的朋友以及方便自己日后的查阅。

iOS开发库文件的分类

静态库:

    1. 静态库有 .a 和 .framework 两种形式;
    1. 在程序编译时会被链接到目标代码中,程序运行时将不再需要改静态库。

动态库:

    1. .dylib 和 .framework 形式,后来.dylib动态库又被苹果替换成.tbd的形式;
    1. 在程序编译时并不会被链接到目标代码中,只是在程序运行时才被载入,因为在程序运行期间还需要动态库的存在。

结论

  • 同一个静态库在不同程序中使用时,每一个程序中都得导入一次,打包时也被打包进去,形成一个程序;
  • 而动态库在不同程序中,打包时并没有被打包进去,只在程序运行使用时,才链接载入(如系统的框架如 UIKit、Foundation 等),所以程序体积会小很多,但是苹果不让使用自己的动态库,否则审核就无法通过(为什么不让使用本人不是很清楚,还请大神普及)。

framework 制作过程

1. 首先新建一个项目,选择 Cocoa touch Framework :

新建CocoaTouchFramework

2. 然后随便取一个名字 MyFramework_Create:

取名MyFramework_Create

3. 然后根据不能的业务需求写好自己的代码,这里因为是测试,我随便写点,新建一个 Dog 类,然后公开一个方法并随便 log 一点东西:

新建Dog类

4. 工程配置:

  • 4.1 选择工程文件 > target 第一项 > Build Setting > 搜索 linking,然后几个需要设置的选项都显现出来,首先是 Dead Code Stripping 设置为 NO,网上对此项的解释如下,意思是如果开启此项就会对代码中的 " dead ”、" unreachable ” 的代码过滤,不过这个开关是否关闭,似乎没有多大影响,不过为了完整还原 framework 中的代码,将此项关闭也未曾不可。

    • The resulting executable will not include any “dead” or unreachable code.
  • 4.2 然后将Link With Standard Libraries关闭,我想可能是为了避免重复链接:

  • 4.3 最后将 Mach-O Type 设为 Static Library,framework 可以是动态库也可以是静态库,对于系统的framework 是动态库,而用户制作的 framework 只能是静态库.


    工程配置

5. 头文件的设置:将需要公开的头文件从 Project 中拖入 Public,至于是否需要将私有的头文件拖入Private,我觉得直接放在 Project 中即可,若是 Private 中有头文件,打包以后的 framework 中会多出一个Private 的文件夹包含着放入 Private 的头文件,不过我觉得如果是私有最好还是不要让别人看到。以下有三种设置方法,设置前需要在 .h 文件导入:

头文件的设置
  • 5.1 在 target 下找到 Build Phases, 点开 Headers 看到 Project 下面的文件直接右键就可以看到一些选项,选择你所需 Public 的即可。


    头文件的设置1
  • 5.2 在上面的 Headers 界面的时候直接将 Project 下面的文件拖到 Public 下面即可。


    头文件的设置2
  • 5.3 选中 Dog.h 文件,在 Xcode 右边找到 Target Memership 右下角的(注意不是 Xcode 整个界面右下角)上下箭头,那里就有你想要的:


    头文件的设置3

6. iPhone 5 和 iPhone 5c 特殊机型架构的支持配置

  • 选中 Build Settings > Architectures > 单击该选项的右边 > other > armv7s ,即可


    特殊机型架构的支持配置1

    特殊机型架构的支持配置2

7. 编译生成 .framework 文件

  • 7.1 先选择Generic iOS Device,按下 Command+B:Build 一下:
真机编译.png
  • 7.2 然后随意选择一个模拟器再次 Build 一下:
模拟器编译.png

8. 合并真机与模拟器生成 .framework 文件:

  • 8.1 Show in Finder 找到 Build 后的 framework
Show in Finder.png
  • 8.2 我们看到总共有两个文件夹,上面是真机编译生成的文件,下面是模拟器编译生成的文件。
真机与模拟器的framework.png
  • 8.3 我们在 Products 同级目录下(路径可以任意选)新建一个 名为 MyFramework_Create 的文件夹作为输出路径,这里取名要与项目名一致,至于为什么到后面自己会明白的。
新建MyFramework_Create的文件夹作.png
  • 8.4 使用命令行合并:lipo -create + 上面两个文件的路径(是指真机与模拟器MyFramework_Create.framework 目录下的 MyFramework_Create文件) + -output + 合成后文件的输出路径。 最后回车即可。


    命令行合并
  • 8.5 将生成的 MyFramework_Test.lipo 文件删除后缀名并代替真机下的 MyFramework_Test 文件就完成了。


    代替MyFramework_Create

framework的测试

1. 新建名为 MyFramework_Test 的工程,注意选择的是 Single View Application :

![](file:////Users/dinpay/Desktop/MyFramework_Create/新建SingleViewApplication.png)
![](file:////Users/dinpay/Desktop/MyFramework_Create/新建MyFramework_Test.png)

新建MyFramework_Test.png

新建SingleViewApplication

2. 将所需要的头文件导入工程,新建一个 dog 对象,并调用 doSmothing 方法,查看控制台的输出,现在已经成功导入测试完成:

运行结果

经典报错

1. 缺少相关头文件的路径,在有些博客上看到说在测试之前就要导入 framework 的 Headers 的路径,发现这不完全正确,在我的经验中如果 framework 中引入了第三方不导入会报错,没有引用的就没有报错,所以个人认为还是看情况,如果运行起来报错说找不到头文件的话,那再做相关配置也无妨,配置方法如下:

![](file:////Users/dinpay/Desktop/MyFramework_Create/头文件配置.png)

头文件配置.png

2. 缺少相关设备架构,报错如下:

缺少相关设备架构
  • 2.1 库中缺少了i386架构的文件,这时我就比较困惑了,明明将模拟器生成的库文件合并进来了,怎么在模拟器上编不通呢!用 lipo -info 命令查看一下,果然没有i386架构的文件
    ![](file:////Users/dinpay/Desktop/MyFramework_Create/架构前.png)
架构前.png
  • 2.2 重新选择 iPhone 5 模拟器与 iPhone 7 模拟器两者运行生成的 .framework 文件合并后与真机生成的 .framework 文件再次合并查看信息,果然有了


    架构后
  • 2.3 架构总结:

    • 对于模拟器来说 4s 和5的模架构是 i386 的32位架构,5s 至今是 x86_64 的64位架构。对于真机来说 3GS~4s 是 armv7 架构,5 和 5c 是 armv7s 架构,5s 至今是 arm64 架构。

3. 将下图中的选项设为 YES,导致其编译时只生成当前机器的框架,将其设置为 NO 后,发现用模拟器编译后生成的 framework 同时包含 x86_64 和 i386 架构。

4. 在项目中引入静态库后,archive 的时候会出现错误

  • 解决办法:



    MacDown logo
  • Bitcode 是苹果在 Xcode7 及以后推出的新功能。用于代码的二次编译,针对 CPU 进行优化,编译工作由苹果 AppStore 后台来完成。针对 iOS 是可选项,默认打开。watchOS 和 tvOS 是必选项,所以需要打开库工程的此选项并加上 -fembed-bitcode 参数,重新编译。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容