您的位置:首页 > 移动开发 > IOS开发

iOS下创建framewok(上)

2016-04-02 00:58 393 查看
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.
# 如果工程名称和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}"

注意:使用这段脚本时“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真机签名文件夹删除之后不知道有没有影响。
以上博文,恳请各位有能力的人能够指教解惑。再三感谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios xcode