以前公司比较纯粹,做自己的研发而已,当时当各种需求不那么纯粹时,你可能需要各种尝试,mark打包frameWork
想把一个功能完整的模块,打包成frameWork分割开来,首先,打开Xcode,file-->new-->workSpace,新建一个工作空间
第二步,创建frameWork,
此时需要做相关设置
设置完以上步骤后
注意细节问题,比如info中的development Target最好和要融合的项目保持一致,一些不支持的ARC的第三方库,要配置支持ARC
打开终端,到该framework路劲,用cocoapod加入要打包的代码需用的第三方库,添加成功之后,重新用workspace打开SDK
把要封装的代码,放入SDK项目中,commend+b后在product中,生成对应的framework
遇到的报错:
invalid iOS deployment version '--target=i386-apple-ios13.0-simulator', iOS 10 is the maximum deployment target for 32-bit targets
解决方案:
如果需要完整的融合,可能还涉及到要打包bundle资源文件,bundle打包步骤如下
新建project,xcode-->file-->new-->project
选macOS下的bundle
bundle创建之后设置相关配置如下图
把需要打包的xib 图片等文件,放到该bundle中
分别选择ios 设备 和模拟器,commend+b 在product中看见两个版本的bundle文件
生产bundle资源文件后,对于xib 以及图片资源的引用,需要注意修改NSString* bundlePath = [[NSBundle mainBundle]pathForResource: @"MyBundle"ofType:@"bundle"];
NSBundle*resourceBundle = [NSBundle bundleWithPath:bundlePath];
图片获得bundle中的资源
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"SourcesBundle" ofType:@"bundle"];
NSString *imgPath= [bundlePath stringByAppendingPathComponent:@"xxx"];
可能出现的问题,
第一:重复问题,模块化的代码,打包后,可能和融合的项目中代码重复,尤其注意类别代码,报连接错误时,注意看一下错误上下文一般会提示重复的文件类
第二:缺失第三库库文件问题,打包的项目里可能存在的第三方库,需要在当前项目用同样的方式,比如cocoapod引入
第三:注意第三方API中的framework及bundle资源文件的添加
细节问题,因人而异不在赘述,打卡,Mark!
关于真机包和模拟器包合并
1、首先在在连接真机的情况下编译出一个版本,show in finder可见
2、再次选中模拟器编译一个版本,编译成功之后 show in finder可见
3、 输入 lipo -info加真机上的FW中二进制文件的路径,回车,最后得到的arm64说明是真机
输入lipo -info加模拟器FW中二进制文件的路径,回车,最后得到的i386 x86_64说明是模拟器
4、lipo +空格+ _create+空格+framewrok下二进制文件的目录+空格+同样真机framework目录下二进制文件的目录+ -output + 空格 + 同样真机framework目录下二进制文件的目录
例如:lipo -create /Users/yonyou/Desktop/10.22号合并FW/真机/YYOUPatProject.framework/YYOUPatProject /Users/yonyou/Desktop/10.22号合并FW/模拟器/YYOUPatProject.framework/YYOUPatProject -output /Users/yonyou/Desktop/10.22号合并FW/真机/YYOUPatProject.framework/YYOUPatProject
合并出来的包,就是真机FW目录下的framwork了。根据上述,由于输出的文件路径直接放在了真机FW的文件路径中,所以此时原来只支持真机的FW已经被替换,可以同时支持模拟器和真机,直接放在项目中使用即可。
注意-output在哪个文件夹路径下,最后合并的二进制文件就在哪个路径下
最后需要用合并的二进制文件替换原来真机或者模拟器framework下面的二进制文件,才是最后合成适用真机和模拟器的合并包。
如果出现:have the same architectures (arm64) and can't be in the same fat output file问题,
XCode12之前:
编译模拟器静态库支持i386 x86_64两架构
编译真机静态库支持armv7 arm64两架构
使用lipo -create -output命令可以将两个库合并成一个支持模拟器和真机i386 x86_64 armv7 arm64四种架构的胖子库。
XCode12编译的模拟器静态库也支持了arm64,导致出现真机库和模拟器库不能合并的问题。
解决办法:
Build Settings -> Excluded Architectures里按照这样设置一下,再编译合并就不会报错了
合并真机及模拟器包的另一种方法
在Run Script中添加如下代码,添加完成之后,分别选择模拟器,和真机,再次cmd+B,成功之后,会自动弹出,对应路径的打好包的SDK,直接使用即可.
if["${ACTION}"="build"]
then
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework
DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework
SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework
# 如果真机包或模拟包不存在,则退出合并
if[ ! -d"${DEVICE_DIR}"] || [ ! -d"${SIMULATOR_DIR}"]
then
exit 0
fi
# 如果合并包已经存在,则替换
if[ -d"${INSTALL_DIR}"]
then
rm -rf"${INSTALL_DIR}"
fi
mkdir -p"${INSTALL_DIR}"
cp -R"${DEVICE_DIR}/""${INSTALL_DIR}/"
# 使用lipo命令将其合并成一个通用framework
# 最后将生成的通用framework放置在工程根目录下新建的Products目录下
lipo -create"${DEVICE_DIR}/${PROJECT_NAME}""${SIMULATOR_DIR}/${PROJECT_NAME}"-output"${INSTALL_DIR}/${PROJECT_NAME}"
#合并完成后打开目录
open"${SRCROOT}/Products"
fi