iOS 静态库 framework制作流程记录

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

其中有xib,图片等资源.

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

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

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


iOS 静态库 framework制作流程记录_第1张图片

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

iOS 静态库 framework制作流程记录_第2张图片


iOS 静态库 framework制作流程记录_第3张图片

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

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


iOS 静态库 framework制作流程记录_第4张图片

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


iOS 静态库 framework制作流程记录_第5张图片

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


iOS 静态库 framework制作流程记录_第6张图片


在这里设置成静态库

iOS 静态库 framework制作流程记录_第7张图片

此时,RHAFNetWorkingTool的build phases如下

iOS 静态库 framework制作流程记录_第8张图片

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



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

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


iOS 静态库 framework制作流程记录_第9张图片

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


iOS 静态库 framework制作流程记录_第10张图片


iOS 静态库 framework制作流程记录_第11张图片

BitCode 改为NO,

iOS 静态库 framework制作流程记录_第12张图片

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

iOS 静态库 framework制作流程记录_第13张图片

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  

#import

@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已变黑

iOS 静态库 framework制作流程记录_第14张图片

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


iOS 静态库 framework制作流程记录_第15张图片
iOS 静态库 framework制作流程记录_第16张图片

6合并两个framework

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


iOS 静态库 framework制作流程记录_第17张图片


iOS 静态库 framework制作流程记录_第18张图片


iOS 静态库 framework制作流程记录_第19张图片


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版本,像下图做法一样

iOS 静态库 framework制作流程记录_第20张图片


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

iOS 静态库 framework制作流程记录_第21张图片

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

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

iOS 静态库 framework制作流程记录_第22张图片

参考网址:

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

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

你可能感兴趣的:(iOS 静态库 framework制作流程记录)