1、新建一个framework工程
2、添加代码
-
非本地集成的第三方
添加podfile文件后用Cocoapods集成
-
本地代码
把需要打包的项目文件直接拖进来
设置公开和需要隐藏的代码(需要公开的放Public,隐藏的放Project)
3、设置支持的版本
4、设置Architectures arm64 x86_64
5、设置Mach-O Type static 静态库
framework可以是动态库也可以是静态库,对于系统的framework是动态库,而用户制作的framework只能是静态库
6、设置Dead Code Stripping 无效代码剥离
是一项优化技术,用于在iOS应用程序构建过程中删除未使用的代码,以减小最终应用的大小。但是对于framework来说, 应该设置为NO, 避免代码、调试符号等被剥离
7、设置Build Libraries for Distribution 为分发构建库
将 “Build Libraries for Distribution” 选项设置为 “Yes” 是为了确保生成的库文件包含必要的接口文件,以便于向下兼容性。这个选项告诉编译器生成 “.swiftinterface” 文件,这对于将来使用低版本的 Swift 编译器加载旧版本库非常重要
8、关闭Link With Standard Libraries 可能是为了避免重复链接
9、新建Aggregate
10、修改User Script Sandboxing
11、设置Release模式
需要将ExportFramework和ExportTarget都设置为Release模式
12、添加脚本
将下方任一脚本代码复制进来
12.1普通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}"
12.2 xcframework
#!/bin/sh
# 要 build 的 target 名称
TARGET_NAME=${PROJECT_NAME}
if [[ $1 ]]; then
TARGET_NAME=$1
fi
# 输出目录
XCFRAMEWORK_OUTPUT_FOLDER="${SRCROOT}/${PROJECT_NAME}/"
ARCHIVE_PATH="${SRCROOT}/${PROJECT_NAME}/Archives"
# 创建输出目录并清理之前的文件
mkdir -p "${XCFRAMEWORK_OUTPUT_FOLDER}"
rm -rf "${XCFRAMEWORK_OUTPUT_FOLDER}/${TARGET_NAME}.xcframework"
rm -rf "${ARCHIVE_PATH}"
# 构建 iOS 真机(iphoneos)Framework
xcodebuild archive \
-scheme "${TARGET_NAME}" \
-sdk iphoneos \
-configuration ${CONFIGURATION} \
-archivePath "${ARCHIVE_PATH}/${TARGET_NAME}-iphoneos.xcarchive" \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
# 构建 iOS 模拟器(iphonesimulator)Framework
xcodebuild archive \
-scheme "${TARGET_NAME}" \
-sdk iphonesimulator \
-configuration ${CONFIGURATION} \
-archivePath "${ARCHIVE_PATH}/${TARGET_NAME}-iphonesimulator.xcarchive" \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
# 创建 XCFramework
xcodebuild -create-xcframework \
-framework "${ARCHIVE_PATH}/${TARGET_NAME}-iphoneos.xcarchive/Products/Library/Frameworks/${TARGET_NAME}.framework" \
-framework "${ARCHIVE_PATH}/${TARGET_NAME}-iphonesimulator.xcarchive/Products/Library/Frameworks/${TARGET_NAME}.framework" \
-output "${XCFRAMEWORK_OUTPUT_FOLDER}/${TARGET_NAME}.xcframework"
# 清理临时文件
rm -rf "${ARCHIVE_PATH}"
# 打开生成的 XCFramework 文件夹
open "${XCFRAMEWORK_OUTPUT_FOLDER}"
13、生成framework
Target选择ExportTarget运行即可
14、补充手动合并framework选项
# 普通framework
1、终端执行命令:lipo -create 第一个framework文件下二进制文件的绝对路径 第二个framework文件下二进制文件的绝对路径 -output 最终的二进制文件路径 如:lipo -create **/真机/WYBasisKit.framework/WYBasisKit **/模拟器/WYBasisKit.framework/WYBasisKit -output WYBasisKit
2、将合并的二进制文件拖进任何一个framework,替换掉原来的,然后把这个新的framework拖进项目就可以使用了
# XCFramework
xcodebuild -create-xcframework \
-framework /path/to/Release-iphoneos/WYBasisKit.framework \
-framework /path/to/Release-iphonesimulator/WYBasisKit.framework \
-output /path/to/output/WYBasisKit.xcframework