美文网首页
iOS 静态库打包

iOS 静态库打包

作者: 问题饿 | 来源:发表于2018-03-23 10:10 被阅读26次

    一、简单介绍

    什么是库

    库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。
    iOS中的静态库有 .a 和 .framework两种形式;动态库有.dylib 和 .framework 形式,后来.dylib动态库又被苹果替换成.tbd的形式。其中系统中.framework文件是动态库,自己打包出来的.framework是静态库,不然审核通不过

    静态库与动态库的区别

    静态库和动态库是相对编译期和运行期的:静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要改静态库;而动态库在程序编译时并不会被链接到目标代码中,只是在程序运行时才被载入,因为在程序运行期间还需要动态库的存在。


    二、Framework的打包

    1、创建SDK工程以及测试用例代码

    (1)创建一个文件夹,然后在里面添加工程组,便于测试SDK


    创建一个工程组将其添加在新建的文件夹下
    结果如上图所示

    (2)在工作组中添加一个新的项目,用于测试打包好之后的SDK


    添加新的项目工程,起完名字之后添加到相应的工程组 (3)创建一个新的framework工程,将其添加到相应的工程组 创建framework工程

    (4)添加文件到工程,并且在相应的文件中导入接口文件


    添加文件到工程

    (5)创建完成之后对应的项目组成,一个用于测试,一个用于打包SDK


    项目组成

    (6)实现方法,并且记得将方法暴露在.h文件中


    实现方法

    (7)配置相关参数:


    将其配置修改,Static Library 静态库
    将其build active 都修改成NO,用于来适配所有的机型,如果选择了YES则只能适配部分机型
    给Architectures项目中添加armv7s编译器

    将需要暴露可以引用的头文件放在public下面,private放不需要暴露的头文件,其中对应的SDK的主头文件一定要放在public下面,不然无法引用


    将需要暴露的头文件放在public下面

    (8)进行打包
    创建一个Aggregare


    添加target
    选择Aggregare
    创建一个新的Run

    下面把这段脚本复制进去(格式不要错,格式错编译不通过)

    # Sets the target folders and the final framework product.
    
    # 如果工程名称和Framework的Target名称不一样的话,要自定义FMKNAME
    
    # 例如: FMK_NAME = "MyFramework"
    
    FMK_NAME=${PROJECT_NAME}
    
    # Install dir will be the final output to the framework.
    
    # The following line create it in the root
    
    folder of the current project.
    
    INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework
    
    # Working dir will be deleted after the framework creation.
    
    WRK_DIR=build
    
    DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
    
    SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
    
    # -configuration ${CONFIGURATION}
    
    # Clean and Building both architectures.
    
    xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build
    
    xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build
    
    # Cleaning the oldest.
    
    if [ -d "${INSTALL_DIR}" ]
    
    then
    
    rm -rf "${INSTALL_DIR}"
    
    fi
    
    mkdir -p "${INSTALL_DIR}"
    
    cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
    
    # Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.
    
    lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
    
    rm -r "${WRK_DIR}"
    
    open "${INSTALL_DIR}"
    
    将对应代码赋值到相对应的位置

    选择对应target工程,Com + B进行编译,注意不要选错


    选择对应target进行编译

    编译通过之后就成功了,然后通过Finder找到对应的打包好的SDK,然后将对应编译好的SDK直接使用就可以
    (9)进行使用


    FrameWork的使用,以及最后成功的结果

    三、.a文件的打包

    (1).a文件的创建 .a文件库选择并创建

    然后在创建的文件中进行实现方法,记得要将想调用的方法放在.h中暴露出来,否则无法调用

    进行配置参数的设置,需要将头文件暴露出来,以及选择适配的机型 添加相对应的头文件
    将需要暴露的头文件放在public中
    这里需要注意的是暴露出来的头文件中import的其他类也得添加到public中暴露出来。 
    如果不想将import的类暴露出来,那么在头文件中用@class 然后在对应的.m文件中再import。 
    总之 
    1. 你再外面用到的类,一定要暴露出来; 
    2. 你暴露出来的类,头文件中导入的类也一定是暴露出来的 
    3. 如果提示导入头文件报错,找不到文件,找不到谁暴露谁就对了 
    
    设置适配的机型
    打包前的准备

    (2)进行打包操作

    1. 首先在真机情况下编译 (Generic iOS Device),并记录下.a文件的绝对路径 ,在下图中具有标示,未编译前.a文件是红色的,编译之后.a文件变成了黑色,表示编译成功。
    2. 选择一个模拟机进行编译,并记录下.a文件绝对路径 ,跟上面一步相同
    3. 用命令行合并1、2部记录的文件,到新的.a文件,名字最好取开始我们取的名字吧,命令行:lipo -create 文件1路径 文件2路径 -output 最终文件路径
    4. 把你要暴露的.h文件和你已经生成的.a文件搞到一个文件夹里,这个文件夹就可以直接拖到工程里用啦


      选择真机进行编译,左下方的.a文件在编译过后会变黑色!其中右边大方框里面是其绝对路径,将其拷贝出来使用

      5.最后将生成的.a静态库文件和需要暴露的.h放在一个新建的文件夹中,然后将这个新建的文件夹放在你需要使用的工程中,这样你就可以使用了


      新建的文件目录,可以使用的静态库文件
      6.最后将生成的新文件放在项目中进行测试使用
      测试使用的结果

    category是我们在开发中经常使用到的方法,如果在category打包成静态库之后放在项目中无法使用,则需要在使用静态库的工程配置中将other linker flags的值设置成-ObjC,这是因为在调用category中的方法时会有找不到该方法的运行时错误(selector not recognized)
    一般在使用静态库的时候,都是在静态库的内部创建一个.h文件(一般起个的名字静态库名字相同),然后把所需要暴露的.h都集中的放在这个.h文件中,这样这些原本需要暴露的文件就不需要暴露了,只需要将这个新建的.h文件暴露出来就可以了

    相关文章

      网友评论

          本文标题:iOS 静态库打包

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