Xcode9 framework文件创建、自动化打包

这段时间在研究模块化,就把项目里用到的一些库打成Framework文件,但是在打包过程中发现每次生成文件非常麻烦也看到网上有许多自动化打包的流程就自己实现了一些。秉着独乐乐不如众乐乐的口号,把这些经验分享给大家。
这里关于framework库的作用我就不予说明了,相信大家也都知道。咱就直接进入正题吧。

步骤

创建文件
1.打开Xcode如图选择Cocoa Touch Framework输入Framework名称就算创建完成了:

Xcode9 framework文件创建、自动化打包_第1张图片
Snip20180602_1.png

2、工程创建完成之后你可以导入你的文件,就比如这样
Xcode9 framework文件创建、自动化打包_第2张图片
Snip20180602_4.png

配置参数
在TARGETS下选中工程,在Build Settings下更改几个参数
Mach-O Type 改为 Static Library
Architectures 增加 armv7s
Link With Standard Libraries关闭,避免重复链接

Xcode9 framework文件创建、自动化打包_第3张图片
1440398-da1cdc8a7a98f7f6.png
Xcode9 framework文件创建、自动化打包_第4张图片
1440398-df57a4870204e50a.png

设置Header(暴露头文件)
在TARGETS下选中工程,在Build Phases下的header里暴露头文件

Xcode9 framework文件创建、自动化打包_第5张图片
Snip20180602_7.png

做完这些就可以开始自动化打包

自动化打包

选中TARGETS下的工程,点击上方的Editor,选择Add Target选择Cross-platform里的Aggregate,然后命名选择完成。如图所示


Xcode9 framework文件创建、自动化打包_第6张图片
Snip20180602_10.png

然后shell脚本粘贴进去就可以了

#要build的target名
# 如果工程名称和Framework的Target名称不一样的话,要自定义TARGET_NAME
# 例如: TARGET_NAME = "Custom"
TARGET_NAME=${PROJECT_NAME}
if [[ $1 ]]
then
TARGET_NAME=$1
fi
UNIVERSAL_OUTPUT_FOLDER="${SRCROOT}/${PROJECT_NAME}/"

#创建输出目录,并删除之前的framework文件
mkdir -p "${UNIVERSAL_OUTPUT_FOLDER}"
rm -rf "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework"

#分别编译模拟器和真机的Framework
xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build

#拷贝framework到univer目录
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework" "${UNIVERSAL_OUTPUT_FOLDER}"
#合并framework,输出最终的framework到build目录
lipo -create -output "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${TARGET_NAME}.framework/${TARGET_NAME}"

#删除编译之后生成的无关的配置文件
dir_path="${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/"
for file in ls $dir_path
do
if [[ ${file} =~ ".xcconfig" ]]
then
rm -f "${dir_path}/${file}"
fi
done
#判断build文件夹是否存在,存在则删除
if [ -d "${SRCROOT}/build" ]
then
rm -rf "${SRCROOT}/build"
fi
rm -rf "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator" "${BUILD_DIR}/${CONFIGURATION}-iphoneos"
#打开合并后的文件夹
open "${UNIVERSAL_OUTPUT_FOLDER}"

然后基本上就完成了,需要使用脚本的时候直接选择脚本点击编译就会在工程根目录下生成Framework文件,编译的时候选择所有设备


Xcode9 framework文件创建、自动化打包_第7张图片
Snip20180602_13.png
Xcode9 framework文件创建、自动化打包_第8张图片
Snip20180602_14.png

总结

1.在制作framework或者lib的时候,如果使用了category,则使用改FMWK的程序运行时会crash,此时需要在该工程中 other linker flags添加两个参数 -ObjC -all_load。

2.带有图片资源的需要把图片打包成Bundle文件,和framework一起拷贝到相应的项目中。

3.公开的类中如果引用的private的类,打包以后对外会报错,找不到那个private的类,可以把那个private的.h放到

4.namespace 冲突。静态库用了某第三方库,项目也用了同样的第三方库,在编译的时候就会有 duplicate symbol 错误,因为有两份同样的第三方库。解决办法就是把用到的第三方库加上自定义前缀,包括类名、delegate 协议、常量名,尤其需要注意 Category 的方法名要修改。

5.图片等资源文件用 bundle 方式打包。一个简单制作 bundle 的方法:新建文件夹,重命名为 YourSDK.bundle,然后 Show Package Contents 打开,加入图片。使用图片的时候需要指明 bundle: [UIImage imageNamed:@"YourSDK.bundle/img.png"]。也可以用 Target 方式制作 bundle,比如 iOS Library With Resourceshttp://www.galloway.me.uk/tutorials/ios-library-with-resources/.

你可能感兴趣的:(Xcode9 framework文件创建、自动化打包)