本文共 2180 字,大约阅读时间需要 7 分钟。
早期xcode可以创建.a的静态库或.dylib的动态库,现在(2017.1)一般直接创建Framework工程。
打开xcode,file-new-project,选择Cocoa Touch Framework就可以创建一个framework工程了。创建完成后默认的framework是动态库,点击Build Settings - Mach-O Type可以选择动态库还是静态库。
关于动态库和静态库的比较可以参考网上的资料,对于使用者而言,导入动态库唯一要注意的是在General - Embedded Binaries中需要添加对应动态库。
framework给用户使用需要支持bitcode,除了在Build Settings中需要把Enable Bitcode设为YES,还需要在Other C Flags添加编译选项-fembed-bitcode,如下图所示。
如果开发的SDK库需要根据不同模块组合打出不同的库,这个时候xcode中的Targets就派上用场了。
假如我们有一个MyFramework,现在需要打两个framework,他们有各自独立的功能,但同时有公用的模块。这个时候可以点击Targets左下角+号,新增一个名叫TestFramework的target。相应的工程目录会出现TestFramework的文件夹。为源文件指定target可以选中某个文件,右侧Target Membership中指定。也可以在选中target,在Build Phases中一次性指定编译文件及暴露的头文件。
需要打包时,只需要在xcode右上角选择不同的target编译即可。
iOS的framework需要支持四种架构,i386,x86,armv7,arm64。由于xcode不支持打包生成所有架构的framework包,需要手动真机build一次,模拟器build一次,两次生成的文件通过lipo -create 命令合成一个framework。
build时需要将scheme切换到Release模式,否则xcode只会编译目标设备对应到架构。当然,也可以在Build Settings中将Build Active Architecture Only设为NO。每次都手动打包很是麻烦,真实项目中一般都通过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'// 合并两个版本,输出文件TestFrameworklipo -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
转载地址:http://sdsnl.baihongyu.com/