知识补充:
工程中Build settings中几个设置含义:
1.Build Active Architecture Only:
设置为yes表示它只编译当前的architecture版本
设置为no表示会编译所有的版本
为了提高编译速度:
一般debug的时候可以选择设置为yes,release的时候要改为no,以适应不同设备。
2.Excluded Architectures
该编译选项指定了工程将不被编译成支持哪些指令集
3.Architectures
该编译选项指定了工程将被编译成支持哪些指令集
4.Valid Architectures
该编译项指定可能支持的指令集,该列表和Architectures列表的交集,将是Xcode最终生成二进制包所支持的指令集
5.X86_64 和 arm64 切换
使用模拟器运行,制作的SDK是X86_64
使用真机运行,制作的SDK是arm64
查看一个framework所支持的指令集:
1.cd 至framework的路径下:cd /…/X.framework
2.查看:lipo -info X
SDK开发流程
1.创建一个文件夹SDKDemo,把涉及到的工程都放在里面,便于管理。
2.新建一个TestWorkSpace,路径放在SDKDemo中,我们取名交TestWorkSpace
3.创建测试工程TestDemo,路径也放在SDKDemo中
4.创建一个SDK工程,取名LaoGaoSDK
5.创建一个AggreGate文件关联SDK,这样每次只要编译demo,就能自动生成framework文件并直接跳到文件目录
添加自动生成framework的脚本文件
脚本内容如下,可直接复制,什么都不用改
#!/bin/sh
#要build的target名
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}"
lipo "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}" -remove arm64 -output "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}"
#合并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}"
6.配置项目基础设置及暴露头文件给外部调用
在主头文件中导入需要暴露给外部的文件
7.为SDK添加图片资源
主要有两种方法:
方法一:直接创建一个文件夹,后缀改为.bundle
方法二:选中sdk工程,点加号添加bundle工程
设置bundle文件
1.Base SDK 为 iOS
2.COMBINE_HIDPI_IMAGES 为NO,否则bundle中的图片就是tiff格式
3.Build Options的Enable Bitcode 为NO
4.将资源文件拖进bundle(resource)文件中
5.构建bundle文件
6.将构建好的bundle文件添加到framework中
SDK中相关图片加载:
将生成的framework和创建的bundle文件添加到TestDemo中
7.将TestDemo与LaoGaoSDK都添加到TestWorkSpace中
文件目录结构如下:
打开TestWorkSpace把TestDemo与LaoGaoSDK都添加到TestWorkSpace中