iOS开发-静态库制作(三)

XCode6以前因为不支持.framework自定义静态库的制作,使用最多的是.a静态库,但是.a静态库制作完成之后,我们还必须保存工程的.h文件,看起来有些不伦不类的,封装的不够彻底,而.framework则不需要,本篇主要介绍.framework静态库的制作和使用。

制作步骤

  • 首先新建一个项目,选择Framework&Library中的Cocoa Touch Framework。

  • 创建完成之后开始编写我们需要封装的代码,为了演示我新建了三个类。

  • 配置参数,这里制作的是静态库,需要将Mach-O Type设置为Static Library

  • 和.a类似,生成的静态库需要进行合并才能适应不同的平台,为了方便,我们可以向Xcode添加脚本来解决这个繁琐的问题。

    1. 新建target

    2. 选择Aggregate

    3. 我们在target的Build Phases中点击加号

    4. 添加一个Run Script

    5. 在里面添加脚本,脚本代码如下:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      # 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}"

  • 代码编写完成以后,我们需要设置哪些文件是暴露给开发者的,哪些是需要隐藏的,如下图,我们将需要暴露的文件移到Public下即可,Project中的文件是隐藏的,Private中的文件跟Public一样也是暴露的,博主暂时也不清楚Private文件的用意。

使用方法

使用方式如下图,直接将.framework拖入工程即可。

注意事项

  1. Category错误

    错误描述:静态库中如果包含了Category(分类),有时候在使用静态库的工程中会报“方法找不到”的错误(unrecognized selector sent to instance)。

    具体原因:参见编译参数-objc说明

    解决方案:在使用静态库的工程中配置Other Linker Flags为-ObjC

  2. 制作成动态库

    错误描述:在使用静态库时,运行报错(Reason: Image Not Found)

    具体原因:可能由于没有设置Mach-O Type,做的是动态库,在使用的时候需要额外加一个步骤,要把Framework同时添加到General --> Embedded Binaries中。

    解决方案:将Mach-O Type设置为Static Library

参考

Xcode6制作动态及静态Framework

iOS中制作可复用的框架Framework

iOS开发——创建你自己的Framework