使用Xcode 5.1.1编译iOS Framework详细教程

来源:互联网 发布:工控组态软件 编辑:程序博客网 时间:2024/05/21 17:15

最近两天一直在研究如果打包封包的问题,在网上就着了很久自认为还不错的文章就保留下来了点击打开链接

作为iOS开发者,想必我们都用过Apple自带的或者第三方开发的Framework(框架),比如,当我们开发音视频功能时,需要在Xcode的TARGETS -> General -> Linked Frameworks and Libraries内添加苹果自带的框架AudiToolBox.framework与AVFoundation.framework,又比如,我们使用科大讯飞的语音SDK时,需要下载他们提供的框架iflyMSC.framework,并添加至Linked Frameworks and Libraries内。

如果我们作为第三方开发者,需要将自己开发的iOS工具包或者SDK分享给其他开发者,而又不想公开源码,那么这时候就需要将iOS源码编译成框架后发布出来,我们将这个过程通俗地称为“打包”。但“打包”并不容易,很多开发者包括我一开始都无从下手,Google了很多英文博客才搞定。好记心不如烂笔头,为了便于自己下次再次打包,同时为了方便有打包需求的其他开发者,故制作该教程指导大家如何使用Xcode编译iOS Framework。

1、新建静态库工程

选择iOS -> Framework & Library -> Cocoa Touch Static Library

ios_framework_tutorials_01

很多第三方SDK,如微信、新浪微博、Google AdMob选择的是Static iOS Framework,最终编译出来是类似于libXXX.a的静态库文件,这种方式的缺点在于libXXX.a静态库文件与公开的头文件是分开的,不便于管理。如果选择Cocoa Touch Static Library,最终编译出来的是一个完整的Framework Bundle文件,它类似于一个压缩包文件,会整合编译出来的静态库与公开的头文件,便于管理与使用。

2、为你的工程取个名字

ios_framework_tutorials_02

这个演示用Framework最终想实现的功能是对外提供一个helloFramework接口,其他工程加载这个框架后调用该接口弹出警告框并显示“Hello Framework”,故将工程名称设置为HelloFramework,组织名称跟公司名称你都可以根据自己的需求来设置。如果不是十分想突出你产品或公司的品牌价值的话,这些随意设置即可。

3、为你的工程选择一个存储位置

ios_framework_tutorials_03

随意选择,方便找到即可,我这里选择的是桌面。

4、删除Xcode向导自动生成的文件

ios_framework_tutorials_04

如上图所示,有4处需要删除,删除①、②两处时按下图所示,将其删除至回收站即可。

ios_framework_tutorials_05

删除后所剩文件如下:

ios_framework_tutorials_06

5、删除Xcode自动生成的配置选项

ios_framework_tutorials_07

在Xcode内按快捷键Command+Shift+<或者通过Product->Scheme->Edit Scheme…进入配置编辑界面,点击Manage Scheme..,在如下界面内删除自动生成的HelloFramework配置,删除完毕后点击OK返回。

ios_framework_tutorials_08

6、新增一个Target

步骤1~5只是利用Xcode向导新建了一个iOS静态库工程,自动生成了一系列配置,然后删除了其自动生成的基本文件与配置,而接下来才开始新建iOS框架工作。我个人的理解是,Xcode只为iOS提供了生成静态库的向导,没有提供生成Bundle的向导,但Xcode为OS X提供了生成Bundle的向导,所以我们只能利用Xcode为OS X提供的新建Bundle向导来为iOS新建Bundle,最终将这个Bundle转化为Framework。

ios_framework_tutorials_09

ios_framework_tutorials_10

ios_framework_tutorials_11

类似与步骤2,为你的框架(新建的Target)取个名字,这将是最终生成的框架的文件名,我这里取为“HelloFramework”,组织跟公司名沿用之前新建工程时设置的。

7、修改步骤6中新建的Target的“Build Setting”

(1)修改Architectures(架构)内的配置

选择Standard architectures、选择Latest iOS、Build Active Architecture Only选No。

(2)修改Deployment(部署)内的配置

OS X部署目标选择OS X默认编译器,让Xcode自动判断OS X系统版本,为了兼容iPhone跟iPad,目标设备两者都选,为了兼容尽可能多的iOS版本,iOS部署目标选择可选的最低版本,我这里可选的最低版本是iOS 4.3。

ios_framework_tutorials_13

(3)修改Linking(链接)内的配置

优化代码选项设置为No,链接标准库选项设置为No,指定目标文件的链接格式为重定位方式。

ios_framework_tutorials_14

(4)修改Packaging(打包)内的配置

打包的默认后缀名是bundle,将其更改为framework。

ios_framework_tutorials_15

8、修改步骤6中新建的Target的”Info”

Bundle OS Type code选项默认为BNDL,改为FMWK,原理同步骤7中的(4),将默认的Bundle更新为Framework。

ios_framework_tutorials_16

9、注释Xcode自动生成的预编译头文件

ios_framework_tutorials_17

10、为新建的框架添加类(简单演示,故只新建一个类,大型工程需要多少类就新建多少类)

ios_framework_tutorials_18

我这里新建一个名为“HelloFramework”的类。

ios_framework_tutorials_19

ios_framework_tutorials_20

ios_framework_tutorials_21

11、在新添加的类中完成你要实现的功能

由于是简单演示,故只实现一个弹出警告框显示“Hello Framework”的对外接口。分别在HelloFramework.m中实现hello函数,在HelloFramework.h文件中给以声明。

ios_framework_tutorials_22

ios_framework_tutorials_23

12、添加你要对外公开的头文件

ios_framework_tutorials_24

ios_framework_tutorials_25

13、插入一个步骤

由于步骤4中忘了删除Frameworks内的UIKit.framework,直接编译会报错,故在此更正步骤4的截图。

ios_framework_tutorials_26

①~④步已经在步骤4中完成了,这里只需要补上第⑤步。

14、编译真机跟模拟器可以通用的框架

首先,添加一个集合器Aggregate,命名为buildUniversalFramework(编译真机跟模拟器通用框架)。

ios_framework_tutorials_27

ios_framework_tutorials_28

ios_framework_tutorials_29

然后,新建一个编译脚本,写入编译指令。

ios_framework_tutorials_30

ios_framework_tutorials_31

在Products目录内存放编译生成的框架,框架名称由第2行FMK_NAME=来指定。
不难看出,上侧编译脚本的任务是在工程文件所在目录内新建一个Products目录,然后分别编译真机跟模拟器的框架,再把真机框架内的文件拷贝至Products目录下,最后用lipo命令将真机框架与模拟器框架合并到Products目录内下,同时删除编译时自动生成的build目录。

上侧的编译脚本如下,大家使用时务必修改第2行FMK_NAME=后面的框架名称:

# Sets the target folders and the final framework product.FMK_NAME=HelloFramework# 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=buildDEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.frameworkSIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework# Building both architectures.xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneosxcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator# Cleaning the oldest.if [ -d "${INSTALL_DIR}" ]thenrm -rf "${INSTALL_DIR}"fi# Creates and renews the final product folder.mkdir -p "${INSTALL_DIR}"# Copies the headers and resources files to the final product folder.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}"

最后,编译真机模拟器通用框架。

ios_framework_tutorials_32

ios_framework_tutorials_33

在工程文件所在目录下的Products目录内就能找到我们刚刚编译成功的真机模拟器通用框架。

ios_framework_tutorials_34

到此,整个框架编译过程也完毕了。

15、附加:测试框架

(1)新建一个iOS Single View Application工程,命名为test,存在Desktop(桌面)上。

ios_framework_tutorials_35

ios_framework_tutorials_36

ios_framework_tutorials_37

ios_framework_tutorials_38

(2)将HelloFramework框架添加到新工程内。

ios_framework_tutorials_39

ios_framework_tutorials_40

(3)在test工程启动后调用HelloFramework框架对外提供的hello接口,选择一个模拟器,点击运行。

ios_framework_tutorials_41

ios_framework_tutorials_42

(4)虽然运行成了,但我们发现Xcode提示了警告。

ios_framework_tutorials_43

这是由于我们编译的框架是静态库,运行崩溃时不会自动生成dSYM文件,只需要在新工程Build Setting -> Build Options下的Debug Information Format修改为DWARF即可。

ios_framework_tutorials_44

再次运行,Xcode不再提示警告。

16、结束语

其实编译类似于libXXX.a的iOS静态库框架,采用Xcode自带的向导,不必进行如上这么多复杂的操作即可完成。国内绝大多数公司提供的iOS框架也是似于libXXX.a的iOS静态库附加头文件。之所以这篇教程非要指导大家将框架编译成类似于XXX.framework的形式,也是为了跟苹果自带的绝大多数框架呈现形式保持一致,同时也让开发者简单拖动这个XXX.framework到工程就能完成对框架的加载。

整篇教程,个人觉得比较有技术含量的是步骤14,尤其是14中利用Aggregate自动合并真机框架与模拟器框架,虽然新建工程时写这么多脚本语言比较麻烦,但一旦写完后,以后每次打包就相当方便了,不必再去Terminal(终端)内合并真机框架与模拟器框架,既能省力,又可以避免不少因为粗心而造成的错误。


0 0
原创粉丝点击