美文网首页
关于打包frameWork

关于打包frameWork

作者: 小白甜 | 来源:发表于2018-08-03 18:28 被阅读0次

以前公司比较纯粹,做自己的研发而已,当时当各种需求不那么纯粹时,你可能需要各种尝试,mark打包frameWork

想把一个功能完整的模块,打包成frameWork分割开来,首先,打开Xcode,file-->new-->workSpace,新建一个工作空间

创建完成后,把他放在,桌面提前建好的文件夹

第二步,创建frameWork,

创建好frameork

此时需要做相关设置

第一步设置 第二步设置 第三步设置

设置完以上步骤后

把要暴露的文件放在public 暴露在外的文件,放在.h中

注意细节问题,比如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

解决方案:

图中设置修改为如图standard

如果需要完整的融合,可能还涉及到要打包bundle资源文件,bundle打包步骤如下

新建project,xcode-->file-->new-->project

选macOS下的bundle

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

相关文章

网友评论

      本文标题:关于打包frameWork

      本文链接:https://www.haomeiwen.com/subject/jwfuvftx.html