由于准备写一个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
#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已变黑
然后选一个模拟器编译模拟器版,完事之后,右键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