• iOS开发——打包静态库与Framework


      最近老是需要做接口给别的客户,就顺便把打包的过程也写一下吧!

      一、静态库

      静态图里面只能是纯文件,里面不能再有第三方打包的静态库,也就是说,静态库不能打包静态库。这个用的比较多,一般自己公司写出来的东西都可以用这个。

      打包的文件随便多少文件夹,没影响。

      1.Cocoa Touch Static Library,找到这个,新建。不同的xcode,位置有所不同。

      2.要打包的源文件扔进去,不能有第三方的静态库。

      3.在Build Phases—>左上角的➕—>New Headers Phase,把需要暴露的.h文件加进去。

      4.分别在模拟器和真机的环境编译一下,command+B,会分别生成对应的.a文件。

      5.左侧的文件目录Products里面,.a文件编译后由红转黑。这就是编译好了,拿到这两个.a文件

      6.在终端里面合成两个.a文件:lipo -create 1.a的路径 2.a的路径 -output 3.a的路径,1.a和2.a生成3.a,3.a就是我们需要的.a文件。

      eg:lipo -create /.../lib1.a /.../lib2.a -output /.../lib3.a

      7.给别人使用,就是给合成的.a文件和暴露的头文件。

      二、Framework

      Framework这个功能更强大,这里只是跟静态库做区分,它可以打包静态库。

      打包的文件并列的放里面,不要文件夹,这点我是从网上看的,还没验证过,谁要是验证了,可以跟我说一下。

      1.Cocoa Touch Framework,找到这个,新建。跟Cocoa Touch Static Library的位置在一起,取名为:MyFramework。

      2.要打包的文件扔进去。

      3.在Build Phases里面的Headers里,把需要暴露的头文件拖到Public里面。

      4.在创建是生成的.h文件中,即MyFramework.h中,里面有两个FOUNDATION_EXPORT,在最下面加上你要暴露的头文件名字。比如#import “handle.h”

      5.新建target:File—>New—>Target,找到Aggregate,取名,比如MyTarget,然后Next。

      6.选择MyTarget—>Build Phases—>左上角的➕—>New Run Script Phase。

      7.在Run Script中,加入脚本:

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

      8.在xcode最上面那一排,更换成我们新建的target,然后编译,command+B。

      9.会自动弹出生成的Framework文件所在的地方。

      10.给别人使用只需要给这个Framework文件就可以了。

      11.如要使用Framework中的handle.h文件,只需导入#import <MyFramework/MyFramework.h>即可。

      注:将Framework直接拖到项目中,该加的地方加上,就跟拖文件到项目中一样,xcode会自动做添加的操作。如果报错:

    dyld: Library not loaded: @rpath/MyFramework.framework/MyFramework
    Referenced from: /var/containers/Bundle/Application/14A1BFBF-FA45-4684-8E33-22A54F006AA0/Demo_test999.app/Demo_test999
    Reason: image not found

      网上有很多文章的解决办法是:

    1、在Xcode中的Build Phases中的Copy Files项中,将你要引用的framework拖到“Linked Frameworks and Libraries“中【如果已经添加了,跳过这一步】
    2、把Build Phases 里framework后边的选项,修改成为Optional就可以了
      你试过之后,发现然并卵,第一个方法,一般拖进项目的时候,xcode自动帮你加了,第二个方法更扯淡,就是不加载这个framework,肯定不会报错啦!
      
      正解:在Xcode中的Build Phases中的Copy Files项中,将framework拖到Copy Files中即可
  • 相关阅读:
    Java基础知识整理
    HashMap源码解读(JDK1.7)
    书籍列表
    mysql4
    mysql3
    mysql2
    mysql1
    数据结构4
    数据结构3
    数据结构2
  • 原文地址:https://www.cnblogs.com/yyt-hehe-yyt/p/6007311.html
Copyright © 2020-2023  润新知