iOS 创建Framework静态库的详细流程

一、创建framework项目

  1. 创建framework工程要选择iOS --> Cocoa Touch Framework
  2. 输入项目名称HawkeyeSDK也是编译生成的framework的名称。
  3. framework的名称也可以以后在项目中更改
创建framework.gif

二、编辑framework代码

创建完framework工程之后,就可开始在framework项目中添加要封装进framework中的代码实现。将已经写好的代码拖到framework项目的代码根目录HawkeyeSDK下。

拖入实现代码

三、配置framework

1. Build Settings 配置

  1. Product Name: 最终编译出来的Framework文件的名称
  2. Mach_O Type: 选中static Library(静态库)
  3. Architectures :支持的CPU指令集,新增armv7s指令集来支持iPhone 5C
  4. Build Active Architecture Only: 设置为NO
  5. Base SDK: 设置成当前Xcode最新版本
  6. iOS Deployment target:framework支持的最低iOS版本

2. Build Phases 配置

  1. Link Binary With Libraries中添加项目的依赖库
  2. Compile Sources:framework 中包含的实现代码
  3. Copy Bundle Resources:项目中使用到的资源文件,图片,XIB文件,plist文件等 (建议将资源文件放到新建的Bundle中,下面会介绍Bundle的创建和使用)
  4. headers:将需要暴露出来的头文件添加到public分组下,需要隐藏的头文件添加到project分组下

四、创建Bundle

在封装framework时,如果使用到了图片,XIB,Html等不需要编译的资源文件的时候,将资源文件打包到Bundle中是最好的选择。下面介绍一下将资源文件打包成Bundle的两个方法

方法一

  1. 选中项目 -> 在Targets 中点击左下角的“+”按钮 -> macOS -> Bundle
  2. 输入Bundle的名称,不要与framework的名称重名(Bundle名称可以在Build settings中更改),否则会创建失败。
  3. 将Framework中用到的资源文件拖入到Bundle的Copy Bundle Resources
2017-07-19 17_54_39.gif

将资源文件拖入Bundle的Copy Bundle Resources之后,就算完成一个Bundle的基本创建。下面还要做一些别的设置

更改Bundle的名称:一般我们打包出来的Bundle都与framework名称相同,在刚开始创建Bundle的时候为了不与framework的名称冲突,Bundle的名字并不与Framework的名称相同,那么接下来可以在Bundle的Build Settings中更改Bundle名

  1. 在Targets中选中 HawkeyeSDKResources -> Build Settings
  2. 在搜索框中搜索Product Name。更改Product Name 后面的内容为你想要的名称
  3. 搜索hidpi 将,COMBINE_HIDPI_IMAGESCombine High Resolution Artwork 改为NO。如果为YES,那么在最终打包的Bundle中,@2x和@3x不同分辨率的图片会被合成成tiff格式 。导致使用图片名称无法访问
  4. 搜索Enable Bitcode 如果能搜索到这一项那么就把其值设置为NO。Bundle是不能使用Bitcode的
bundle4.jpg

HawkeyeSDKResources target添为到HawkeyeSDK的依赖,这样在每次编译HawkeyeSDK的时候也会同时打包HawkeyeSDKResources。而不用每次添加添加资源文件的时候单独处理HawkeyeSDKResources

  1. 在targets中选中HawkeyeSDK
  2. 选择Build Phases
  3. 展开 Target Dependencies
  4. 点击 " + "
  5. 选中HawkeyeSDKResources
  6. 点击 add按钮
2017-07-21 09_27_11.gif

Bundle中的图片

方法二

bundle其实就是相当于一个后缀为.bundle的文件夹。所以,可以创建一个文件夹,然后将后缀修改为.bundle ,然后再将我们使用到的图片复制到文件夹中。

注意:包含xib文件的bundle是不能使用这种方法的。因为xib文件需要处理成nib文件才能被程序使用。有xib文件的bundle要使用第一种方法创建。

五、使用Bundle

在framework中使用bundle中的资源不能直接通过资源的名称来获取。

[UIImage imageNamed:@"logo.png"];

这种方法获取不到logo.png图片。
正确的方式是:先获取到bundle的路径,然后再将资源文件的路径拼接到bundle路径后面才能获取到资源。如下

NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"HawkeyeSDK.bundle" ofType:@"bundle"];
NSString *imagePath = [bundlePath stringByAppendingString:@"/logo.png"];
UIImage *image = [UIImage imageNamed:imagePath];

六、编译项目

编译生成framework静态库之前先将framework对应的scheme中的run 的值改成 Release

编译真机项目

  1. 在设备列表中选中Generic Device
  2. 使用快捷键 CMD + B 编译项目

编译模拟器项目

  1. 在设备列表中选择一个模拟器
  2. 使用快捷键 CMD + B 编译项目

之后会看到在products 分组下的HawkeyeSDK.framework变成黑色。
选中HawkeyeSDK.framework右键,选择Open In Finder 可以看到编译好的两个bundle文件。

七、合成模拟器和真机通用的framework静态库

之前编译生成的两个静态库分别支持模拟器和真机的使用。但是在实际开发中需要即支持模拟器又支持真机使用的静态库怎么办?这个问题当然可以解决,那就是将两个静态库合并生成一个通用的静态库。可以在mac终端中使用下面的命令合成

lipo -create path1/HawkeyeSDK.bundle/HawkeyeSDK path2/HawkeyeSDK.bundle/HawkeyeSDK -output path3/HawkeyeSDK

path1和path2分别是模拟器和真机的静态库的路径。path3是合成之后的文件的存放路径。

八、framework 的使用

  1. 将framework拖入到要使用framework的工程,并在项目的Build PhasesLink Binary Resources中添加framework。

  2. framework使用到的Bundle要添加到工程的Copy Bundle Resources中。不然项目是找不到Bundle中的资源文件的,那么Bundle也就无法正常使用资源文件。

  3. 如果framework中使用到了Category 那么在使用framework的工程中要设置 Build Settings中的Other Link Flag-ObjC或者-all_load

  4. 如果framework有使用系统库,那么也要在使用framework的工程中将这些系统库添加到工程中。不然会报编译错误

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容