iOS静态Framework制作方法

作者: 平原河流 | 来源:发表于2016-11-17 15:31 被阅读853次

    开发做了一段时间后,总会有一些自己的总结,或者说自己的轮子。怎么才能把自己的这些东西合理的利用起来?库文件无疑是最好的方法。

    iOS有哪些库文件?首先看看系统提供的:
    1、静态库文件(.a)
    2、动态库文件(.framework或.dylib或.tbd)

    其中,静态库可以上传到App Store,静态库必须配合相应的头文件目录,才能被使用。动态库不允许上传到App Store,动态库含有头文件目录,可直接使用。

    由于上述原因,就出现了静态Framework,既能保留.a文件可被上传到App Store,又能保留.framework的目录结构。以下就来介绍一下静态Framework的制作方法。

    首先介绍一下开发环境,直接上图:

    开发环境.png

    制作静态Framework,目前有3种方法:

    方法1: 通过.a转静态.framework

    方法2: 通过.bundle转静态.framework

    ** 方法3: 通过动态.framework转静态.framework**

    以下我们分别介绍

    方法1:通过.a转静态.framework

    第一步,创建.a

    打开Xcode

    新建.png

    点击Create a new Xcode Project

    选择静态库.png

    选择Cocoa Touch Static Library,点击 Next,输入Product Name

    输入名称.png

    按照提示完成余下操作,最终进入的工程界面

    工程界面.png

    此时,可以看到Product目录下libMyKit.a为红色,那是因为在磁盘文件中还没有生成该文件。

    自定义头文件,系统默认情况下 Build Phases中,没有Hearders,需要手动点击“+”,自行添加。

    自定义头文件.png

    build该工程,会发现 libMyKit.a变为黑色,此时右击该文件Show In Finder,会看到该文件实际目录结构。如下图:

    库文件目录结构.png

    到这里静态库文件就已经创建好。

    接下来,把创建好的静态库文件转换成静态framework。这里用到了脚本,如下图:

    生成静态framework.png

    附上代码

    set -e
    
    export FRAMEWORK_LOCN="${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework"
    
    # Create the path to the real Headers dir
    mkdir -p "${FRAMEWORK_LOCN}/Versions/A/Headers"
    
    # Create the required symlinks
    /bin/ln -sfh A "${FRAMEWORK_LOCN}/Versions/Current"
    /bin/ln -sfh Versions/Current/Headers "${FRAMEWORK_LOCN}/Headers"
    /bin/ln -sfh "Versions/Current/${PRODUCT_NAME}" \
    "${FRAMEWORK_LOCN}/${PRODUCT_NAME}"
    
    # Copy the public headers into the framework
    /bin/cp -a "${TARGET_BUILD_DIR}/${PUBLIC_HEADERS_FOLDER_PATH}/" \
    "${FRAMEWORK_LOCN}/Versions/A/Headers"
    

    好,到这里,再build一下工程,然后选中libMyKit.a,右击,Show In Finder,会看到该文件实际目录结构。如下图:

    静态framework目录.png

    看到了吧,这样静态framework就已经制作完成了。

    方法2: 通过.bundle转静态.framework

    打开Xcode,点击Create a new Xcode Project,同方法一

    由于iOS 下没有Bundle选项,所以要选中macOS

    创建Bundle.png

    选中Bundle,点击Next

    输入项目名称.png

    按照提示完成余下操作,最终进入的工程界面:

    工程目录.png

    这样生成的是bundle,下面将进行bundle转换成framework

    首先,修改Base SDK,将Base SDK改成最新的iOS SDK就行。

    修改Base SDK.png

    修改Linking
    Dead Code Stripping设置为No
    Link With Standard Libraries设置为No
    Mach-O Type设置为Relocatable Object File

    修改Linking.png

    修改Packaging
    Wrapper Extension设置为framework

    修改Packaging.png

    修改info.plist
    Bundle OS Type code设置为FMWK

    修改info.png

    好了,以上已经完成bundle到framework的改造,下面在工程新建一个MyKit文件,并添加对外头文件,如下图:

    新建文件.png

    完成以上,选择工程Build,然后选中MyKit.framework,右击,Show In Finder

    目录.png

    好啦,以上就完成了bundle转静态framework。

    方法3: 通过动态.framework转静态.framework

    打开Xcode,点击Create a new Xcode Project,同方法一
    选择Cocoa Touch Framework

    创建framework.png

    点击Next

    创建工程.png

    按照提示完成余下操作,最终进入的工程界面:

    工程目录.png

    这样创建好的是一个动态framework
    下面进行由动态像静态改造

    修改Linking
    Mach-O Type设置为Static Library

    修改Linking.png

    完成以上,选择工程Build,然后选中MyKit.framework,右击,Show In Finder

    framework目录.png

    以上就完成了动态framework到静态framework的改造。

    有没有发现方法三最简单!!!

    补充说明:

    细心的伙伴会发现三种方法创建的framwork目录是不一样的,这里就由伙伴们自行去思考了。

    如果有用过支付宝的伙伴,有没有发现,再Archive时,会有一大堆警告。
    那么我们的framework是否也有警告的,这有待伙伴们自行验证。

    解决方法:
    可以这样Build Setting--Code Generation
    Generate Debug Symbol设置为No,即禁止生产调试符号。

    关于通用库

    即支持armv7 armv7s i386 x86_64 arm64,这里就不介绍了。有需要的,简信我,或者在下一篇文章给出。

    参考资料

    1. https://www.raywenderlich.com/65964/create-a-framework-for-ios
    2. http://www.cocoachina.com/bbs/read.php?tid-282490.html
    3. http://years.im/Home/Article/detail/id/52.html

    相关文章

      网友评论

      • 景彧:mark,楼主你写的这个真不错。
      • YxxxHao:欢迎投稿我SDK开发专题
      • Frey丶:这几天我也是一直做静态库.搞c++和oc混编,遇到很多坑.已解决.看了你的文章,很不错.过几天我也整理一下写出来. 加油!
        平原河流:@Frey丶 加油

      本文标题:iOS静态Framework制作方法

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