美文网首页iOS Question Book
浅谈插件化(二)

浅谈插件化(二)

作者: 夕W | 来源:发表于2018-08-03 20:42 被阅读0次

    上一篇说了一下如何准备好两大工具,github 和 trunk 账号!

    这一篇主要说的是,当你的代码里有一些不可描述的内容不想让别人看到,总之不想暴露自己的源码,只想让别人调用你公共API。 这时候我们可以把代码块打包成 Static Liabrary 或者是 Framework

    也就是 .a文件 和 .framework 文件  大致来说   .framework = .a + header文件

    这两种文件的具体差别不多说了,有兴趣的可以看StaticLibrary和Framework的区别

    话不多说,步骤开撸。

    一.创建 StaticLibrary

    1.打开Xcode 创建一个新的project 在界面选择上按下图选择

    然后完成自己的功能,这里用一个简单的小功能代替.

    功能完成后 使用Command + B 分别在模拟器和Generic iOS Device 环境下编译一遍.然后在product文件下会生成一个library文件,这时候show in finder 会发现有iphones 和 iphonesimulater两个文件包 里面分别有一个.a文件,这就是我们刚才编译生成的static library文件,分别是模拟器状态和真机状态.

    编译生成的library文件 两种环境下的文件包

    然后需要使用 lipo create 命令行合并初一个适合两种环境的.a文件

    lipo -create 模拟器环境下的.a文件路径  真机环境下的.a文件路径   -output  目标.a文件路径

    适合两种环境的.a 

    这时候就可以把这个.a 文件 和所需的.h文件拖到你的工程中使用了. bingo~

    二.创建Framework

    1.打开Xcode 创建一个新的project 在界面选择上按下图选择

    2.同样的完成自己的功能代码块  依旧用一个小demo来说明

    方法声明 方法实现

    3.选中 Target ,选择 Build Phases - Headers ,可以看出有三个选项,分别是 Public 、Private 、Project ,把需要公开给别人的 .h 文件拖到 Public 中,把不想公开的,即为隐藏的 .h 文件拖到 Project 中

    4. 在系统生成header文件下 按你的需求导入你的public header文件(必须导入,不然在别人使用的时候找不到你的头文件)

    5. 在Architectures下增加armv7s,并选中。将Build Active Architecture Only 设置为NO

    至于为什么添加 可以看这篇帖子链接

    并把Architecture Only 改为 No

    将Mach-O Type设为Static Library,framework,对于系统的framework是动态库,而用户制作的framework只能是静态库,要设置defines module为NO,不然集成的时候会出现Include of non-modular header inside framework module错误。设置bitcode为NO。

    6.打包framework

    方法一. 手动打包(不建议) 还是分别在两种环境下编译工程  并用 lipo  create. -output 命令行合并framework 直接改后缀即可.(详细可看.a 打包流程)

     方法二.  脚本自动打包(建议)

    在TARGETS  下添加一个 Aggregate  并在此target下的build phases 增加一个新的脚本 如图

    复制 粘贴下面的脚本代码 

    # 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}"

    选中编译环境

    在这个编译环境下编译 你便可以得到一个适合 模拟器和真机环境的 .framework.  

     到此为止framework 制作完毕.自己建立个新工程测试一下,直接将刚才的.framework 导入测试

    测试结果

    bingo~。~

    相关文章

      网友评论

        本文标题:浅谈插件化(二)

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