iOS 静态库 framework制作流程记录

由于准备写一个SDK,网上各种搜framework制作方法,自己在此做个记录,方便以后查看.

其中有xib,图片等资源.

这个demo就是将AFNetWorking二次封装进一个文件,然后暴露出.h文件,其中还有一个ViewController,只是为了测试.

其中AFNetworking用pod导入,不打包,因为很可能sdk的使用者会用到AFNetWorking,为了避免冲突,让用户自己导入AFNetWorking.

1,新建工程如图,名字:RHAFNetWorkingTool


2.进入到工程目录,初始化pod,导入AFNetWorking,


esc,:wq保存退出,pod install安装cocoaPod

3.拖入自己的封装的文件,进行一些设置


暴露需要暴露的.h文件,将相应的.h文件拖到如图所示的Public区域


在RHAFNetWorkingTool.h中加入暴露的.h头文件,用framework的形式import



在这里设置成静态库

此时,RHAFNetWorkingTool的build phases如下

最后设置一下最低适配版本,我设置的9.0,因为牵涉到safe area问题



4,整理生成bundle文件,用于存放xib,storybod及图片资源 

file->new->target->macOS->Bundle,取名:RHAFNetWorkSource


将xib文件及图片等资源放到RHAFNetWorkSource文件夹下



BitCode 改为NO,

command + B 编译,bundle文件已经变黑了

5设置编译framework

(1)首先framework中资源的引用,不能按以前的路径LBBViewController.m的实现如下

#import "LBBViewController.h"

#import "LBBCommonTool.h"

@interface LBBViewController ()

@property (weak, nonatomic) IBOutlet UIImageView *imageView1;

@property (weak, nonatomic) IBOutlet UIImageView *imageView2;

@end

@implementation LBBViewController

- (instancetype)init{

    LBBViewController *testVC = [[LBBViewController alloc]initWithNibName:@"LBBViewController" bundle:[LBBCommonTool getSourcesBundle]];

    returntestVC;

}

- (void)viewDidLoad {

    [super viewDidLoad];

    self.imageView1.image = [LBBCommonTool getImages:@"aa.jpg"];

}

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

@end

(2)而LBBCommonTool作为framework中的一个公共类,提供获取图片及bundle的方法,方便framework中其他文件调用LBBCommonTool.h

#import  <Foundation/Foundation.h>

#import <UIKit/UIKit.h>

@interface LBBCommonTool :NSObject

+ (UIImage*)getImages:(NSString*)name;

+ (NSBundle*)getSourcesBundle;

@end


LBBCommonTool.m 

#import "LBBCommonTool.h"

@implementation LBBCommonTool

+ (UIImage*)getImages:(NSString*)name{

    return [UIImage imageNamed:name inBundle:[LBBCommonTool getSourcesBundle] compatibleWithTraitCollection:nil];

}

+ (NSBundle*)getSourcesBundle{

    return [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"RHAFNetWorkSource" ofType:@"bundle"]];

}

@end

Command + B 然后编译真机版,products中的framework已变黑

然后选一个模拟器编译模拟器版,完事之后,右键RHAFNetWorkingTool.framework,show in finder,找到文件目录查看一下


6合并两个framework

file->new->target->Cross-platform->Aggregate,命名为RHAFNetWorkingTool_Universal





FRAMEWORK_NAME="${PROJECT_NAME}"

#FRAMEWORK_NAME="YourFrameworkTargetName"

SIMULATOR_LIBRARY_PATH="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${FRAMEWORK_NAME}.framework"

DEVICE_LIBRARY_PATH="${BUILD_DIR}/${CONFIGURATION}-iphoneos/${FRAMEWORK_NAME}.framework"

UNIVERSAL_LIBRARY_DIR="${BUILD_DIR}/${CONFIGURATION}-iphoneuniversal"

FRAMEWORK="${UNIVERSAL_LIBRARY_DIR}/${FRAMEWORK_NAME}.framework"

#分别编译模拟器和真机的Framework

#xcodebuild -target "${FRAMEWORK_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build

#xcodebuild -target "${FRAMEWORK_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build

rm -rf "${UNIVERSAL_LIBRARY_DIR}"

mkdir "${UNIVERSAL_LIBRARY_DIR}"

mkdir "${FRAMEWORK}"

cp -r "${DEVICE_LIBRARY_PATH}/." "${FRAMEWORK}"

lipo "${SIMULATOR_LIBRARY_PATH}/${FRAMEWORK_NAME}" "${DEVICE_LIBRARY_PATH}/${FRAMEWORK_NAME}" -create -output "${FRAMEWORK}/${FRAMEWORK_NAME}" | echo

open "${FRAMEWORK}"


(我这里一直有一个问题解决不了,按网上的说法,只要加载一个脚本文件,可以同时编译模拟器版和真机版然后自动合并成需要的framework,但是我用哪些脚本编译出来的模拟器版和真机版不好使,导致合并的framework也不好使,所以我这里先用xcode,command+B分别编译模拟器版和真机版,然后用上面的脚本来合并,其中把编译模拟器的和编译真机的那两行代码注释掉了,对于不太懂脚本的我,谁能给我帮助)


前面忘记了非常重要的一步,就是在编译bundle,编译framework的模拟器和真机时,先选中realease,用以编译release版本,像下图做法一样


然后选中RHAFNetWorkingTool_Universal ,command+B 编译弹出最终的framework

将生成的的最终的framework和之前生成的.bundle资源文件放进一个文件夹,之后拖入需要用到的项目

创建一个项目,拖入文件夹,然后还得初始化pod,安装引入AFNetWorking,创建一个按钮,点击执行framework里面的东西,可以看到效果,不管是图片,xib还是网络请求都成功了

参考网址:

        https://www.jianshu.com/p/7452db9e37bd

        https://www.cnblogs.com/sunjianfei/p/8057660.html

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

推荐阅读更多精彩内容