美文网首页
自动化生成framework文件

自动化生成framework文件

作者: 牧羊人Q | 来源:发表于2018-06-02 22:52 被阅读24次

    这段时间在研究模块化,就把项目里用到的一些库打成Framework文件,但是在打包过程中发现每次生成文件非常麻烦也看到网上有许多自动化打包的流程就自己实现了一些。秉着独乐乐不如众乐乐的口号,把这些经验分享给大家。
    这里关于framework库的作用我就不予说明了,相信大家也都知道。咱就直接进入正题吧。

    步骤

    创建文件
    1.打开Xcode如图选择Cocoa Touch Framework输入Framework名称就算创建完成了:

    Snip20180602_1.png
    2、工程创建完成之后你可以导入你的文件,就比如这样
    Snip20180602_4.png

    配置参数
    在TARGETS下选中工程,在Build Settings下更改几个参数
    Mach-O Type 改为 Static Library
    Architectures 增加 armv7s
    Link With Standard Libraries关闭,避免重复链接

    1440398-da1cdc8a7a98f7f6.png 1440398-df57a4870204e50a.png

    设置Header(暴露头文件)
    在TARGETS下选中工程,在Build Phases下的header里暴露头文件

    Snip20180602_7.png

    做完这些就可以开始自动化打包

    自动化打包

    选中TARGETS下的工程,点击上方的Editor,选择Add Target选择Cross-platform里的Aggregate,然后命名选择完成。如图所示


    Snip20180602_10.png

    然后shell脚本粘贴进去就可以了

    #要build的target名
    TARGET_NAME=${PROJECT_NAME}
    if [[ $1 ]]
    then
    TARGET_NAME=$1
    fi
    UNIVERSAL_OUTPUT_FOLDER="${SRCROOT}/${PROJECT_NAME}/"
    
    #创建输出目录,并删除之前的framework文件
    mkdir -p "${UNIVERSAL_OUTPUT_FOLDER}"
    rm -rf "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework"
    
    #分别编译模拟器和真机的Framework
    xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
    xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
    
    #拷贝framework到univer目录
    cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework" "${UNIVERSAL_OUTPUT_FOLDER}"
    #合并framework,输出最终的framework到build目录
    lipo -create -output "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${TARGET_NAME}.framework/${TARGET_NAME}"
    
    #删除编译之后生成的无关的配置文件
    dir_path="${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/"
    for file in ls $dir_path
    do
    if [[ ${file} =~ ".xcconfig" ]]
    then
    rm -f "${dir_path}/${file}"
    fi
    done
    #判断build文件夹是否存在,存在则删除
    if [ -d "${SRCROOT}/build" ]
    then
    rm -rf "${SRCROOT}/build"
    fi
    rm -rf "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator" "${BUILD_DIR}/${CONFIGURATION}-iphoneos"
    #打开合并后的文件夹
    open "${UNIVERSAL_OUTPUT_FOLDER}"
    
    

    然后基本上就完成了,需要使用脚本的时候直接选择脚本点击编译就会在工程根目录下生成Framework文件,编译的时候选择所有设备


    Snip20180602_13.png Snip20180602_14.png

    总结

    1.在制作framework或者lib的时候,如果使用了category,则使用改FMWK的程序运行时会crash,此时需要在该工程中 other linker flags添加两个参数 -ObjC -all_load。

    2.带有图片资源的需要把图片打包成Bundle文件,和framework一起拷贝到相应的项目中。

    3.公开的类中如果引用的private的类,打包以后对外会报错,找不到那个private的类,可以把那个private的.h放到

    4.namespace 冲突。静态库用了某第三方库,项目也用了同样的第三方库,在编译的时候就会有 duplicate symbol 错误,因为有两份同样的第三方库。解决办法就是把用到的第三方库加上自定义前缀,包括类名、delegate 协议、常量名,尤其需要注意 Category 的方法名要修改。

    5.图片等资源文件用 bundle 方式打包。一个简单制作 bundle 的方法:新建文件夹,重命名为 YourSDK.bundle,然后 Show Package Contents 打开,加入图片。使用图片的时候需要指明 bundle: [UIImage imageNamed:@"YourSDK.bundle/img.png"]。也可以用 Target 方式制作 bundle,比如 iOS Library With Resourceshttp://www.galloway.me.uk/tutorials/ios-library-with-resources/.

    相关文章

      网友评论

          本文标题:自动化生成framework文件

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