美文网首页
iOS 静态库 framework制作流程记录

iOS 静态库 framework制作流程记录

作者: 阳光天天耀 | 来源:发表于2018-04-13 21:02 被阅读43次

    由于准备写一个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

    相关文章

      网友评论

          本文标题:iOS 静态库 framework制作流程记录

          本文链接:https://www.haomeiwen.com/subject/pokljttx.html