1、iOS->Framework&Library->framework
2、编写framework代码,(为了演示,写个SWPerson类)
3、修改配置参数
苹果不让包含有自己制作的动态库的项目上线,所以需要手动设置为静态库。
在Build Settings —>Linking —>Mach-O Type选择Static Library
4、设置编译选项(可选)
如果我们在打包的工程中,为系统的类增加了分类的情况下,需要修改这个编译选项,否则请跳过
在Build Settings—>Linking—>Other Linker Flags在后面增加[ObjC]注意大小写
other linker flags的参数说明
[ObjC]:这个flag告诉链接器把库中定义的Objective-C类和Category都加载进来。这样编译之后的app会变大,因为加载了很多不必要的文件而导致可执行文件变大。但是如果静态库中有类和category的话只有加入这个flag才行,但是Objc也不是万能的,当静态库中只有分类而没有类的时候,Objc就失效了,这就需要使用-all_load或者-force_load了。
[-all_load]:会强制链接器把目标文件都加载进来,即使没有objc代码。但是这个参数也有一个弊端,那就是你使用了不止一个静态库文件,那么你很可能会遇到ld:duplicate symbol错误,因为不同的库文件里面可能会有相同的目标文件,这里会有两种方法解决 1:用命令行就行拆包。2:就是用下面的这个参数 [-force_load]:这个flag所做的事情跟-all_load其实是一样的,只是-force_load需要指定要进行全部加载的库文件的路径,这样的话,你就只是完全加载了一个库文件,不影响其余库文件的按需加载。
参考引用的文章https://blog.csdn.net/bobo553443/article/details/78633340
5、设置头文件
在Build Phases—>Headers下可以看到如下的结构:
只有Public里面的头文件才会给人看到,Project(默认情况下)和Private中的都不会被使用者看到。
设置好需要公开的头文件后,我们需要再公开的头文件中引用,被公开的头文件
import <QCloud_TTS_F/SWPerson.h>
6、打包
到这里我们就差不多可以打包我们需要的framework了,选择真机和模拟器(任意一个模拟器都可以),分别编译,成功之后,我们会发现在我们新建的Framework工程的Products目录下,QCloud_TTS_F.framework变成了黑色,表示物理路径存在。
7、合并
选中QCloud_TTS_F.framework,右击选择Show in Finder,我们会看到在Products目录下有真机和模拟器两个版本,在每一版本的QCloud_TTS_F.framework下有一个QCloud_TTS_F文件,我们实际上需要合并的就是这个文件。
a、打开终端,输入cd,然后把Products文件拖进终端,enter
b、lipo -create Debug-iphoneos/QCloud_TTS_F.framework/QCloud_TTS_F Debug-iphonesimulator/QCloud_TTS_F.framework/QCloud_TTS_F -output QCloud_TTS_F
c、在Products目录下生成了QCloud_TTS_F文件,然后分别到真机和模拟器的版本下替换掉。
合并的命令说明:
lipo -create 文件1的路径 文件2的路径 -output 合并之后的文件路径(没有表示在当前目录下)合并之后的文件名称
每一个参数之间都应该至少留出一个空格
8、使用脚本文件进行打包
echo begin sdk run
function build()
{
xcodebuild -showsdks
SDK=iphoneos13.2
echo "SDK:"$SDK
xcodebuild clean
xcodebuild build -sdk $SDK
SDK=iphonesimulator13.2
echo "SDK:"$SDK
xcodebuild build -sdk $SDK
CONGRUATION="Release"
if [ -d "build/output" ]; then
rm -rf build/output
fi
sdkoutput=build/output/sdk
echo "sdk ouput direcotry is " $sdkoutput
mkdir -p build/output
mkdir -p build/output/device
mkdir -p build/output/simulator
mkdir -p $sdkoutput
cp -R build/$CONGRUATION-iphoneos/*.framework build/output/device
cp -R build/$CONGRUATION-iphonesimulator/*.framework build/output/simulator
cp -R build/output/device/QCloud_TTS_F.framework build/output/sdk
lipo -create build/output/device/QCloud_TTS_F.framework/QCloud_TTS_F build/output/simulator/QCloud_TTS_F.framework/QCloud_TTS_F -output build/output/sdk/QCloud_TTS_F.framework/QCloud_TTS_F
}
build
echo end sdk run