新建Framwork工程

早期xcode可以创建.a的静态库或.dylib的动态库,现在(2017.1)一般直接创建Framework工程。
打开xcode,file-new-project,选择Cocoa Touch Framework就可以创建一个framework工程了。





iOS 网络下载framework 后加载 apple framework_嵌入式


新建工程


创建完成后默认的framework是动态库,点击Build Settings - Mach-O Type可以选择动态库还是静态库。



iOS 网络下载framework 后加载 apple framework_嵌入式_02


使用静态库


关于动态库和静态库的比较可以参考网上的资料,对于使用者而言,导入动态库唯一要注意的是在General - Embedded Binaries中需要添加对应动态库。

Bitcode支持

framework给用户使用需要支持bitcode,除了在Build Settings中需要把Enable Bitcode设为YES,还需要在Other C Flags添加编译选项-fembed-bitcode,如下图所示。


iOS 网络下载framework 后加载 apple framework_Desktop_03


-fembed-bitcode


SDK模块化

添加多个target

如果开发的SDK库需要根据不同模块组合打出不同的库,这个时候xcode中的Targets就派上用场了。
假如我们有一个MyFramework,现在需要打两个framework,他们有各自独立的功能,但同时有公用的模块。这个时候可以点击Targets左下角+号,新增一个名叫TestFramework的target。相应的工程目录会出现TestFramework的文件夹。



iOS 网络下载framework 后加载 apple framework_动态库_04


新增target


指定target编译文件

为源文件指定target可以选中某个文件,右侧Target Membership中指定。也可以在选中target,在Build Phases中一次性指定编译文件及暴露的头文件。


iOS 网络下载framework 后加载 apple framework_嵌入式_05


Target Membership


iOS 网络下载framework 后加载 apple framework_动态库_06


Build Phases


需要打包时,只需要在xcode右上角选择不同的target编译即可。

打包Framework工程

iOS的framework需要支持四种架构,i386,x86,armv7,arm64。由于xcode不支持打包生成所有架构的framework包,需要手动真机build一次,模拟器build一次,两次生成的文件通过lipo -create 命令合成一个framework。
build时需要将scheme切换到Release模式,否则xcode只会编译目标设备对应到架构。当然,也可以在Build Settings中将Build Active Architecture Only设为NO。



iOS 网络下载framework 后加载 apple framework_xcode_07


Build Active Architecture Only设置


每次都手动打包很是麻烦,真实项目中一般都通过xcodebuild实现脚本打包,相关选项可以通过man xcodebuild查看,这里只举一个例子说明脚本打包的一般过程,具体实现可以使用shell,python等脚本语言:

// 切换到项目目录
cd ~/workspace/MyFramework

// 使用xcodebuild命令编译TestFramework这个target的arm版本
xcodebuild -project MyFramework.xcodeproj -scheme TestFramework -configuration Release CONFIGURATION_BUILD_DIR='~/Desktop/build/arm'

// 使用xcodebuild命令编译TestFramework这个target的x86版本
xcodebuild -project MyFramework.xcodeproj -scheme TestFramework -configuration Release -sdk iphonesimulator10.2 CONFIGURATION_BUILD_DIR='~/Desktop/build/x86'

// 合并两个版本,输出文件TestFramework
lipo -create ~/Desktop/build/arm/TestFramework.framework/TestFramework ~/Desktop/build/x86/TestFramework.framework/TestFramework -output ~/Desktop/build/TestFramework

// 将合并的文件覆盖arm/TestFramework.framework中对应文件
cp ~/Desktop/build/TestFramework ~/Desktop/build/arm/TestFramework.framework 

// 合并后的framework包移动到桌面
mv ~/Desktop/build/arm/TestFramework.framework ~/Desktop/

// 删除build文件夹
rm -r ~/Desktop/build

// 验证framework包含的框架集,如果结果是“armv7 i386 x86_64 arm64”说明没有问题
lipo -info ~/Desktop/TestFramework.framework/TestFramework