iOS开发Framework工程-阿里云开发者社区

开发者社区> 开发与运维> 正文

iOS开发Framework工程

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

新建Framwork工程

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

img_c8976672d67de788a5e3ebd2ad4eda12.png
新建工程

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


img_c51a3d9c74fa396331a8932c2a20f200.png
使用静态库

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

Bitcode支持

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

img_272e5852de91c74e329511ccb4c89588.png
-fembed-bitcode

SDK模块化

添加多个target

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


img_5c8b47f0002c9591ecb54e4c797f70cf.png
新增target

指定target编译文件

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

img_4c3938ed55d77729d0215b6dc08f36d5.png
Target Membership
img_3ba9d0b1a30a1347df69a541b256a5b4.png
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。


img_6341393e3240499e6491adbc5affd4ef.png
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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章