iOS开发Framework工程

新建Framwork工程

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

iOS开发Framework工程_第1张图片
新建工程

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


iOS开发Framework工程_第2张图片
使用静态库

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

Bitcode支持

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

-fembed-bitcode

SDK模块化

添加多个target

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


iOS开发Framework工程_第3张图片
新增target

指定target编译文件

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

iOS开发Framework工程_第4张图片
Target Membership
iOS开发Framework工程_第5张图片
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工程_第6张图片
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

你可能感兴趣的:(iOS开发Framework工程)