如何优雅的提供第三方库Framewrok

导语

在平时的工作和生活中,我们经常会有这么一些情境,需要将自己代码提供给第三方使用,而又不想公开源码。这个时候我们就需要,打包成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.


如何优雅的提供第三方库Framewrok_第1张图片
image.png

2、因为要打包所需的文件,所以这里我自己创建了SLCat.h,SLCat.m文件,并且添加对应的saySomething方法。


image.png

3、然后选中Target,选中Build Phases -> Headers,可以看出有三个选项,分别是Public,Private,Project;把需要暴露给别人的.h文件拖到Public中,剩下的不要暴露的,即为隐藏的文件,放在Project中。一般新建 Cocoa Touch Framework之后就会自动出现一个FrameworkTest.h,我们一般可以考虑直接把对应的对应Framework里面用到的内容添加进去,这样就只需要暴露FrameworkTest.h,当然为了测试更加方便,那么我们这里把SLCat.h也对外暴露。


如何优雅的提供第三方库Framewrok_第2张图片
image.png

4、此时可以看下生成的Framework


image.png

如果正确的话生成的Framework如下:


如何优雅的提供第三方库Framewrok_第3张图片
image.png

5、修改一些配置信息,生成支持所有架构的版本
修改build setting 里面的build active architecture only 如图片所示的把Yes修改为NO
如果直接通过Debug生成Framework需要把这个改成NO,否者生成的Framework只会是支持当前的机型,比如笔者这里使用的是iphoneX所以生成的就仅仅是 arm64的Framework包。

如何优雅的提供第三方库Framewrok_第4张图片
image.png

将上诉的包通过 lipo --info查看下可以清楚的看到
image.png

当然后续笔者会介绍通过脚本的方式,优雅的生成Framework.

在build setting 里面搜索 “mach”,设置type为 “static library” , 由于苹果默认是不支持第三方库为动态库,而且提供给别人用最好采用静态库。如下图


如何优雅的提供第三方库Framewrok_第5张图片
image.png

如果采用动态库,别人引入的时候,还需要在下面设置中添加,否者会出现: image not found之类的错误。


如何优雅的提供第三方库Framewrok_第6张图片
image.png

重新运行之后,可以看到如下信息:


image.png

6、然后分别用模拟器和真机进行CMD+B进行编译


如何优雅的提供第三方库Framewrok_第7张图片
image.png

7、把两个Framework的包合并成一个包
采用命令如下,由于要介绍更优雅的方法

lipo -create 路径a 路径b -output 路径a

脚本化的形式自动生成Framework

1、首先点击如下新建一个 Aggregate


image.png
如何优雅的提供第三方库Framewrok_第8张图片
image.png

2、之后 build phases的增加运行脚本
既然使用脚本为什么不直接写shell而要在这里新建呢? 2个方向的考虑,第一、外面写shell需要配置对应的描述文件之类的,否者会找不到。第二、工程内的路径,在这里面是可以直接拿到的。


如何优雅的提供第三方库Framewrok_第9张图片
image.png

在里面增加如下代码来完成对应的脚本


如何优雅的提供第三方库Framewrok_第10张图片
image.png

文字版如下:
# 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等到如下
如果需要输出两个包,请注意连接一个真机,运行如下:


如何优雅的提供第三方库Framewrok_第11张图片
image.png

4、经历了一番辛苦可以看到如下


如何优雅的提供第三方库Framewrok_第12张图片
image.png

5、 再用lipo验证下如下, 大功告成


如何优雅的提供第三方库Framewrok_第13张图片
image.png

FAQ

如果我代码中依赖于第三方库怎么办

采用pod新建workspace,然后通过类似的方法完成打包

提供了framewrok如何更优雅的提供给别人使用

才用pod的方式,也方便自己进行版本维护

参考的文档和链接

关于xcode8的建立依赖其他第三方库(cocoapods管理)的静态库framework
iOS开发:自定义framework并打包
xcodebuild命令介绍
iOS 比较详细的自定义framework编译方法

你可能感兴趣的:(如何优雅的提供第三方库Framewrok)