使用Xcode 5.1.1编译iOS Framework详细教程
2015-01-21 10:58
656 查看
最近两天一直在研究如果打包封包的问题,在网上就着了很久自认为还不错的文章就保留下来了点击打开链接
作为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
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_01-300x202.jpg)
很多第三方SDK,如微信、新浪微博、Google AdMob选择的是Static iOS Framework,最终编译出来是类似于libXXX.a的静态库文件,这种方式的缺点在于libXXX.a静态库文件与公开的头文件是分开的,不便于管理。如果选择Cocoa Touch Static Library,最终编译出来的是一个完整的Framework Bundle文件,它类似于一个压缩包文件,会整合编译出来的静态库与公开的头文件,便于管理与使用。
2、为你的工程取个名字
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_02-300x202.jpg)
这个演示用Framework最终想实现的功能是对外提供一个helloFramework接口,其他工程加载这个框架后调用该接口弹出警告框并显示“Hello Framework”,故将工程名称设置为HelloFramework,组织名称跟公司名称你都可以根据自己的需求来设置。如果不是十分想突出你产品或公司的品牌价值的话,这些随意设置即可。
3、为你的工程选择一个存储位置
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_03-300x213.jpg)
随意选择,方便找到即可,我这里选择的是桌面。
4、删除Xcode向导自动生成的文件
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_04-300x185.jpg)
如上图所示,有4处需要删除,删除①、②两处时按下图所示,将其删除至回收站即可。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_05-300x83.jpg)
删除后所剩文件如下:
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_06-300x176.jpg)
5、删除Xcode自动生成的配置选项
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_07-300x203.jpg)
在Xcode内按快捷键Command+Shift+<或者通过Product->Scheme->Edit Scheme…进入配置编辑界面,点击Manage Scheme..,在如下界面内删除自动生成的HelloFramework配置,删除完毕后点击OK返回。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_08-300x237.jpg)
6、新增一个Target
步骤1~5只是利用Xcode向导新建了一个iOS静态库工程,自动生成了一系列配置,然后删除了其自动生成的基本文件与配置,而接下来才开始新建iOS框架工作。我个人的理解是,Xcode只为iOS提供了生成静态库的向导,没有提供生成Bundle的向导,但Xcode为OS X提供了生成Bundle的向导,所以我们只能利用Xcode为OS X提供的新建Bundle向导来为iOS新建Bundle,最终将这个Bundle转化为Framework。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_09-300x189.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_10-300x202.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_11-300x202.jpg)
类似与步骤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。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_13-300x218.jpg)
(3)修改Linking(链接)内的配置
优化代码选项设置为No,链接标准库选项设置为No,指定目标文件的链接格式为重定位方式。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_14-300x271.jpg)
(4)修改Packaging(打包)内的配置
打包的默认后缀名是bundle,将其更改为framework。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_15-300x204.jpg)
8、修改步骤6中新建的Target的”Info”
Bundle OS Type code选项默认为BNDL,改为FMWK,原理同步骤7中的(4),将默认的Bundle更新为Framework。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_16-300x139.jpg)
9、注释Xcode自动生成的预编译头文件
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_17-300x173.jpg)
10、为新建的框架添加类(简单演示,故只新建一个类,大型工程需要多少类就新建多少类)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_18-300x152.jpg)
我这里新建一个名为“HelloFramework”的类。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_19-300x202.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_20-300x202.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_21-300x250.jpg)
11、在新添加的类中完成你要实现的功能
由于是简单演示,故只实现一个弹出警告框显示“Hello Framework”的对外接口。分别在HelloFramework.m中实现hello函数,在HelloFramework.h文件中给以声明。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_22-300x122.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_23-300x152.jpg)
12、添加你要对外公开的头文件
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_24-300x110.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_25-300x189.jpg)
13、插入一个步骤
由于步骤4中忘了删除Frameworks内的UIKit.framework,直接编译会报错,故在此更正步骤4的截图。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_26-300x185.jpg)
①~④步已经在步骤4中完成了,这里只需要补上第⑤步。
14、编译真机跟模拟器可以通用的框架
首先,添加一个集合器Aggregate,命名为buildUniversalFramework(编译真机跟模拟器通用框架)。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_27-300x165.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_28-300x202.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_29-300x202.jpg)
然后,新建一个编译脚本,写入编译指令。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_30-300x129.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_31-300x192.jpg)
在Products目录内存放编译生成的框架,框架名称由第2行FMK_NAME=来指定。
不难看出,上侧编译脚本的任务是在工程文件所在目录内新建一个Products目录,然后分别编译真机跟模拟器的框架,再把真机框架内的文件拷贝至Products目录下,最后用lipo命令将真机框架与模拟器框架合并到Products目录内下,同时删除编译时自动生成的build目录。
上侧的编译脚本如下,大家使用时务必修改第2行FMK_NAME=后面的框架名称:
最后,编译真机模拟器通用框架。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_32-300x159.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_33-300x137.jpg)
在工程文件所在目录下的Products目录内就能找到我们刚刚编译成功的真机模拟器通用框架。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_34-300x114.jpg)
到此,整个框架编译过程也完毕了。
15、附加:测试框架
(1)新建一个iOS Single View Application工程,命名为test,存在Desktop(桌面)上。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_35-300x98.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_36-300x202.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_37-300x202.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_38-300x213.jpg)
(2)将HelloFramework框架添加到新工程内。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_39-300x141.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_40-300x202.jpg)
(3)在test工程启动后调用HelloFramework框架对外提供的hello接口,选择一个模拟器,点击运行。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_41-300x190.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_42-194x300.jpg)
(4)虽然运行成了,但我们发现Xcode提示了警告。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_43-300x93.jpg)
这是由于我们编译的框架是静态库,运行崩溃时不会自动生成dSYM文件,只需要在新工程Build Setting -> Build Options下的Debug Information Format修改为DWARF即可。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_44-300x120.jpg)
再次运行,Xcode不再提示警告。
16、结束语
其实编译类似于libXXX.a的iOS静态库框架,采用Xcode自带的向导,不必进行如上这么多复杂的操作即可完成。国内绝大多数公司提供的iOS框架也是似于libXXX.a的iOS静态库附加头文件。之所以这篇教程非要指导大家将框架编译成类似于XXX.framework的形式,也是为了跟苹果自带的绝大多数框架呈现形式保持一致,同时也让开发者简单拖动这个XXX.framework到工程就能完成对框架的加载。
整篇教程,个人觉得比较有技术含量的是步骤14,尤其是14中利用Aggregate自动合并真机框架与模拟器框架,虽然新建工程时写这么多脚本语言比较麻烦,但一旦写完后,以后每次打包就相当方便了,不必再去Terminal(终端)内合并真机框架与模拟器框架,既能省力,又可以避免不少因为粗心而造成的错误。
作为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
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_01-300x202.jpg)
很多第三方SDK,如微信、新浪微博、Google AdMob选择的是Static iOS Framework,最终编译出来是类似于libXXX.a的静态库文件,这种方式的缺点在于libXXX.a静态库文件与公开的头文件是分开的,不便于管理。如果选择Cocoa Touch Static Library,最终编译出来的是一个完整的Framework Bundle文件,它类似于一个压缩包文件,会整合编译出来的静态库与公开的头文件,便于管理与使用。
2、为你的工程取个名字
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_02-300x202.jpg)
这个演示用Framework最终想实现的功能是对外提供一个helloFramework接口,其他工程加载这个框架后调用该接口弹出警告框并显示“Hello Framework”,故将工程名称设置为HelloFramework,组织名称跟公司名称你都可以根据自己的需求来设置。如果不是十分想突出你产品或公司的品牌价值的话,这些随意设置即可。
3、为你的工程选择一个存储位置
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_03-300x213.jpg)
随意选择,方便找到即可,我这里选择的是桌面。
4、删除Xcode向导自动生成的文件
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_04-300x185.jpg)
如上图所示,有4处需要删除,删除①、②两处时按下图所示,将其删除至回收站即可。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_05-300x83.jpg)
删除后所剩文件如下:
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_06-300x176.jpg)
5、删除Xcode自动生成的配置选项
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_07-300x203.jpg)
在Xcode内按快捷键Command+Shift+<或者通过Product->Scheme->Edit Scheme…进入配置编辑界面,点击Manage Scheme..,在如下界面内删除自动生成的HelloFramework配置,删除完毕后点击OK返回。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_08-300x237.jpg)
6、新增一个Target
步骤1~5只是利用Xcode向导新建了一个iOS静态库工程,自动生成了一系列配置,然后删除了其自动生成的基本文件与配置,而接下来才开始新建iOS框架工作。我个人的理解是,Xcode只为iOS提供了生成静态库的向导,没有提供生成Bundle的向导,但Xcode为OS X提供了生成Bundle的向导,所以我们只能利用Xcode为OS X提供的新建Bundle向导来为iOS新建Bundle,最终将这个Bundle转化为Framework。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_09-300x189.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_10-300x202.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_11-300x202.jpg)
类似与步骤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。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_13-300x218.jpg)
(3)修改Linking(链接)内的配置
优化代码选项设置为No,链接标准库选项设置为No,指定目标文件的链接格式为重定位方式。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_14-300x271.jpg)
(4)修改Packaging(打包)内的配置
打包的默认后缀名是bundle,将其更改为framework。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_15-300x204.jpg)
8、修改步骤6中新建的Target的”Info”
Bundle OS Type code选项默认为BNDL,改为FMWK,原理同步骤7中的(4),将默认的Bundle更新为Framework。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_16-300x139.jpg)
9、注释Xcode自动生成的预编译头文件
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_17-300x173.jpg)
10、为新建的框架添加类(简单演示,故只新建一个类,大型工程需要多少类就新建多少类)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_18-300x152.jpg)
我这里新建一个名为“HelloFramework”的类。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_19-300x202.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_20-300x202.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_21-300x250.jpg)
11、在新添加的类中完成你要实现的功能
由于是简单演示,故只实现一个弹出警告框显示“Hello Framework”的对外接口。分别在HelloFramework.m中实现hello函数,在HelloFramework.h文件中给以声明。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_22-300x122.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_23-300x152.jpg)
12、添加你要对外公开的头文件
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_24-300x110.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_25-300x189.jpg)
13、插入一个步骤
由于步骤4中忘了删除Frameworks内的UIKit.framework,直接编译会报错,故在此更正步骤4的截图。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_26-300x185.jpg)
①~④步已经在步骤4中完成了,这里只需要补上第⑤步。
14、编译真机跟模拟器可以通用的框架
首先,添加一个集合器Aggregate,命名为buildUniversalFramework(编译真机跟模拟器通用框架)。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_27-300x165.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_28-300x202.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_29-300x202.jpg)
然后,新建一个编译脚本,写入编译指令。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_30-300x129.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_31-300x192.jpg)
在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=build DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework # Building both architectures. xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator # Cleaning the oldest. if [ -d "${INSTALL_DIR}" ] then rm -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}"
最后,编译真机模拟器通用框架。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_32-300x159.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_33-300x137.jpg)
在工程文件所在目录下的Products目录内就能找到我们刚刚编译成功的真机模拟器通用框架。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_34-300x114.jpg)
到此,整个框架编译过程也完毕了。
15、附加:测试框架
(1)新建一个iOS Single View Application工程,命名为test,存在Desktop(桌面)上。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_35-300x98.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_36-300x202.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_37-300x202.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_38-300x213.jpg)
(2)将HelloFramework框架添加到新工程内。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_39-300x141.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_40-300x202.jpg)
(3)在test工程启动后调用HelloFramework框架对外提供的hello接口,选择一个模拟器,点击运行。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_41-300x190.jpg)
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_42-194x300.jpg)
(4)虽然运行成了,但我们发现Xcode提示了警告。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_43-300x93.jpg)
这是由于我们编译的框架是静态库,运行崩溃时不会自动生成dSYM文件,只需要在新工程Build Setting -> Build Options下的Debug Information Format修改为DWARF即可。
![](http://www.cpplive.com/wp-content/uploads/2014/08/ios_framework_tutorials_44-300x120.jpg)
再次运行,Xcode不再提示警告。
16、结束语
其实编译类似于libXXX.a的iOS静态库框架,采用Xcode自带的向导,不必进行如上这么多复杂的操作即可完成。国内绝大多数公司提供的iOS框架也是似于libXXX.a的iOS静态库附加头文件。之所以这篇教程非要指导大家将框架编译成类似于XXX.framework的形式,也是为了跟苹果自带的绝大多数框架呈现形式保持一致,同时也让开发者简单拖动这个XXX.framework到工程就能完成对框架的加载。
整篇教程,个人觉得比较有技术含量的是步骤14,尤其是14中利用Aggregate自动合并真机框架与模拟器框架,虽然新建工程时写这么多脚本语言比较麻烦,但一旦写完后,以后每次打包就相当方便了,不必再去Terminal(终端)内合并真机框架与模拟器框架,既能省力,又可以避免不少因为粗心而造成的错误。
相关文章推荐
- iOS Xcode 5.1.1 使用微信不通过编译问题(ibWeChatSDK.a, missing required architecture arm64)
- Framework-Res.apk 反编译、编译、打包、替换详细教程
- 史上最完整的iOS DIY framework 详细教程(二)
- 【iOS-cocos2d-X 游戏开发之十三】详细讲解在Xcode中利用预编译并通过Jni调用Android的Java层代码(cocos2dx里访问调用Android函数)!
- 史上最完整的iOS DIY framework 详细教程(一)
- Xcode使用教程详细讲解 (上)
- Xcode环境下osip,eXosip, openssl的静态库编译方法(编译出来给IOS使用)
- ios 使用XCode编译时总是提示证书问题
- 史上最完整的iOS DIY framework 详细教程(二)
- Xcode使用教程详细讲解
- 史上最完整的iOS DIY framework 详细教程(二)
- 使用XCode4.5.1编译iOS版Ogre1.8.1的方法
- 史上最完整的iOS DIY framework 详细教程
- Xcode4.6下添加百度地图ios版(BMapKit)详细教程(_BMKMapManager错误解决)
- iOS--------block使用详细教程
- 在xcode 4.2.1中使用skd 5.0 编译出在ios 4.3或者其他版本里面可以用的应用
- 史上最完整的iOS DIY framework 详细教程(一)
- 史上最完整的iOS DIY framework 详细教程
- 【iOS-cocos2d-X 游戏开发之十三】详细讲解在Xcode中利用预编译并通过Jni调用Android的Java层代码(cocos2dx里访问调用Android函数)!
- iOS开发教程:Xcode4.2-Storyboard的简单使用