iOS下创建framewok(上)

iOS开发中,有时候需要将一些工具包装起来,做成sdk提供给客户使用,制作过程可以分为两种。一种是制作静态库.a文件,一种是制作成framework文件。前者操作起来简单,但是提供给客户时比较麻烦,需要提供头文件。后者使用简便,可以直接导入,但是制作较为麻烦。

苹果在iOS8之前都不支持动态库framework方法,所以这里说的framework实质上都是静态库文件。如果有什么理解和整理错误的地方,欢迎大家指出问题所在。

这篇文章主要记录创建framework的方法。创建framework也有两种方法,一种是Xcode6之前的制作方法,一种是Xcode6之后的制作方法。这篇博客先讲解最新版本Xcode7制作framework的方法。

Xcode6就已经提供了动态库的制作方法。这里还是以Xcode7为例,两者的操作步骤是相同的。新建一个Project,选择iOS下的Framework & Library选项:



创建之后,选择你创建的Targets,在BuildSetting中搜索Mach-O,将之设置为Static Library:



然后这里开始写一个类来制作framework,提供给另一个项目进行测试,当新建好一个类文件的时候,需要在默认存在的ZYXTestFramework.h中将新建的类的头文件暴露出来,否则在另一个项目中导入头文件时会出现“Missing XXXXX”的警告。



在新建的类中写一个测试方法,打印传递过来的字符串,头文件暴露出该方法:


完成之后,选择Targets下的Build Phase选项,还需要将新创建的类的头文件暴露给使用framework的开发者调用。Headers下有三个选项Public,Private,Projects。可能中间的Private的名字会让人产生一些困惑,Private并不表明是私有的,其还是暴露了一些东西,Projects才是表明是私有的文件(该解释是从网上一篇教程中看到的,目前也不是太明确,不过一般来说还是使用Public和Projects这两个)。将ZYXFrameworkTest.h移动到Public下。





此时已经可以进行编译操作了,但是这里需要说明:我们制作的framework针对的iPhone手机的架构不只一种,一般模拟器使用的是x86 64与i386,而真机主要是arm64和armv7。armv7s很多sdk都没有特定去编译他,比如说facebook,我查看他们支持的架构未包括armv7s。网上有些教程说需要更改下图中的两个选项,其实对于这篇博文来说是没有必要的。


在编译时,设置为Release状态来进行framework的生成。这里先生成支持模拟器的Release版本,选择EditScheme,将run状态下的Debug改为Release。



运行,生成framework。可以查看生成的framework支持的架构,打开生成的framework在Finder中的位置,拖拽到终端,使用lipo命令来查看支持的架构。其中ZYXTestFramework文件实质上是静态.a文件。



可以看见支持的架构为i386何x86 64。接着再为真机生成一次framewok,因为手边没有真机,没办法截图。生成步骤与上述操作一样,只要换成真机设备就可以了。

最终生成之后需要合并两个文件,使之支持4个架构,在合并时,操作的就是上面所说的实质上是静态.a的ZYXTestFramework文件。在终端下执行lipo -create (模拟器生成的ZYXTestFrameWork路径)     ( 真机生成的路径 )  -outfile  合并的之后的路径和名称


上述生成操作也可以直接使用脚本来执行,在Xcode中新建一个Target,选择Aggregate。该Target可以用来执行脚本生成项目。


新建完毕后,在Build Phase下点击+号,选择New copy Run scripts,然后添加一段脚本



脚本内容如下:

set -e

# Sets the target folders and the final framework product.

# 如果工程名称和FrameworkTarget名称不一样的话,要自定义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}"

注意:使用这段脚本时“xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build”该段脚本直接执行了真机生成,所以就像使用真机调试一样,需要一个签名证书。否则Build会失败。


生成时需要调整Target,对Aggregate执行run操作。最终会在当前项目目录中创建一个Products目录,在该目录下会有合成后的framework。  但是会有一个_codeSignature文件夹,应该是真机调试签名生成的文件夹。因为我看facebook的SDK中的framework中没有这个文件夹,所以不知道删除这个_codeSignature会不会有影响。使用者在使用这个framework时会不会也对这个framework进行签名,如果有人能解惑,非常感谢。


将生成后的framework放入测试项目中,导入头文件,进行测试。因为身边没有手机,所以直接用的模拟器测试的,这也是上面那个问题没有验证的原因。最终测试结果如下:(好像图片上传不了了,导入头文件和调用什么的都没截图了,太大)



可以看见最终是成功调用到framework中的api。这是Xcode7生成framework的方法,我个人觉得最终还是静态的库,应该不会被苹果拒绝,和facebook对比发现就是多了一个_codeSignature文件夹,这个app真机签名文件夹删除之后不知道有没有影响。

以上博文,恳请各位有能力的人能够指教解惑。再三感谢。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值