导语
在平时的工作和生活中,我们经常会有这么一些情境,需要将自己代码提供给第三方使用,而又不想公开源码。这个时候我们就需要,打包成Framework并且优雅地采用cocoapods的方式提供给别人。
首先学习一些基础知识
关于XcodeBuild
1. 1.基本命令
查看xcodebuild简洁用法
xcodebuild -usage
查看已安装的SDK
xcodebuild -showsdks
查看安装的版本号
xcodebuild -version
[-sdk [|] [] ]
查看项目中的Targets、Configurations和Schemes
xcodebuild
-list
[[-project ]|[-workspace ]]
Archive
xcodebuild
archive -archivePath
-project
-scheme #从-list命令中获取
-configuration < Debug|Release>
-sdk #sdkName可从showsdks命令中获取
导出Archive
xcodebuild
-exportArchive
-archivePath
-exportPath
-exportOptionsPlist #这个plist文件可以通过打一次ipa包里面去获取,然后根据需求修改
查看帮助
xcodebuild -help
等等
如何自动化完成framework输出
1、新建一个工程,在进入页面之后,选择Framework & Libray 选项中的 Cocoa Touch Framework.
2、因为要打包所需的文件,所以这里我自己创建了SLCat.h,SLCat.m文件,并且添加对应的saySomething方法。
3、然后选中Target,选中Build Phases -> Headers,可以看出有三个选项,分别是Public,Private,Project;把需要暴露给别人的.h文件拖到Public中,剩下的不要暴露的,即为隐藏的文件,放在Project中。一般新建 Cocoa Touch Framework之后就会自动出现一个FrameworkTest.h,我们一般可以考虑直接把对应的对应Framework里面用到的内容添加进去,这样就只需要暴露FrameworkTest.h,当然为了测试更加方便,那么我们这里把SLCat.h也对外暴露。
4、此时可以看下生成的Framework
如果正确的话生成的Framework如下:
5、修改一些配置信息,生成支持所有架构的版本
修改build setting 里面的build active architecture only 如图片所示的把Yes修改为NO
如果直接通过Debug生成Framework需要把这个改成NO,否者生成的Framework只会是支持当前的机型,比如笔者这里使用的是iphoneX所以生成的就仅仅是 arm64的Framework包。
将上诉的包通过
lipo --info
查看下可以清楚的看到
当然后续笔者会介绍通过脚本的方式,优雅的生成Framework.
在build setting 里面搜索 “mach”,设置type为 “static library” , 由于苹果默认是不支持第三方库为动态库,而且提供给别人用最好采用静态库。如下图
如果采用动态库,别人引入的时候,还需要在下面设置中添加,否者会出现: image not found之类的错误。
重新运行之后,可以看到如下信息:
6、然后分别用模拟器和真机进行CMD+B进行编译
7、把两个Framework的包合并成一个包
采用命令如下,由于要介绍更优雅的方法
lipo -create 路径a 路径b -output 路径a
脚本化的形式自动生成Framework
1、首先点击如下新建一个 Aggregate
2、之后 build phases的增加运行脚本
既然使用脚本为什么不直接写shell而要在这里新建呢? 2个方向的考虑,第一、外面写shell需要配置对应的描述文件之类的,否者会找不到。第二、工程内的路径,在这里面是可以直接拿到的。
在里面增加如下代码来完成对应的脚本
文字版如下:
# Type a script or drag a script file from your workspace to insert its path.
framework_name=${PROJECT_NAME}
development_mode=Release
scheme_name=${PROJECT_NAME}
work_space=${PROJECT_NAME}.xcworkspace
install_dir=${SRCROOT}/Products/${framework_name}.framework
work_dir=build
device_dir=${work_dir}/Release-iphoneos/${framework_name}.framework
simulator_dir=${work_dir}/Release-iphonesimulator/${framework_name}.framework
framwork_temp=Framework
if [ ! -d "${framwork_temp}" ]
then
mkdir -p "${framwork_temp}"
fi
device_temp_dir=${framwork_temp}/${framework_name}.framework
if [ -d "${install_dir}" ]
then
rm -rf "${install_dir}"
fi
xcodebuild -configuration "Release" -target "${framework_name}" -sdk iphoneos clean build
# 注意重新编译会先清空对应的目录,所以这里需要先缓存下第一个结果
cp -R "${device_dir}/" "${device_temp_dir}"
lipo -create "${device_temp_dir}/${framework_name}" "${simulator_dir}/${framework_name}" -output "${install_dir}/${framework_name}"
xcodebuild -configuration "Release" -target "${framework_name}" -sdk iphonesimulator clean build
mkdir -p "${install_dir}"
cp -R "${device_temp_dir}/" "${install_dir}"
lipo -create "${device_temp_dir}/${framework_name}" "${simulator_dir}/${framework_name}" -output "${install_dir}/${framework_name}"
rm -r "${work_dir}"
rm -r "${framwork_temp}"
open "${install_dir}"
当然网上会有很多类似的写法。笔者发现新版的Xcode在第二次xcodebuild的时候会把build文件清空,所以这里用了Framework来临时缓存第一个结果。
3、运行FrameworkAuto等到如下
如果需要输出两个包,请注意连接一个真机,运行如下:
4、经历了一番辛苦可以看到如下
5、 再用lipo验证下如下, 大功告成
FAQ
如果我代码中依赖于第三方库怎么办
采用pod新建workspace,然后通过类似的方法完成打包
提供了framewrok如何更优雅的提供给别人使用
才用pod的方式,也方便自己进行版本维护
参考的文档和链接
关于xcode8的建立依赖其他第三方库(cocoapods管理)的静态库framework
iOS开发:自定义framework并打包
xcodebuild命令介绍
iOS 比较详细的自定义framework编译方法