如何使用Xcode 13创建FAT/Universal通用框架
Xcode 13+ 构建FAT/Universal通用框架完整步骤
Xcode 12.4之后Apple新增了对Apple Silicon设备的模拟器arm64架构支持,原有旧脚本未处理模拟器arm64架构与真机arm64架构重复的冲突,会在合并阶段报错,这是旧流程失效的核心原因。
一、项目基础配置(执行构建前必须完成)
- 打开框架项目,选中对应框架Target,进入Build Settings 标签页
- 找到Architectures 配置项,保留默认值
$(ARCHS_STANDARD)即可,确保覆盖arm64、x86_64全量主流架构 - 找到Build Active Architecture Only 配置,将Debug、Release等所有配置条目都设置为
NO - 找到Excluded Architectures 配置项:
- 针对
Any iOS Simulator SDK条目,添加arm64,排除模拟器侧的arm64架构,避免和真机arm64架构冲突 - 针对
Any iOS SDK条目,不要添加任何排除配置,保证真机架构输出完整
- 针对
- 找到Skip Install 配置项,将所有配置条目设置为
NO
二、手动构建步骤(无需脚本即可快速完成)
- 构建真机版本:顶部运行目标选择任意iOS真机设备,按下
Command + B执行构建,构建完成后右键点击Products目录下的.framework文件,选择Show in Finder,将该框架拷贝到单独的工作目录 - 构建模拟器版本:顶部运行目标选择任意iOS模拟器,按下
Command + B执行构建,同样将构建生成的.framework文件拷贝到同一个工作目录,注意不要和真机版本重名 - 合并二进制文件:打开终端进入工作目录,执行合并命令:
lipo -create 真机框架路径/FrameworkName 模拟器框架路径/FrameworkName -output 输出路径/FrameworkName - 生成最终通用框架:将合并后得到的通用二进制文件,替换掉工作目录中任意一个.framework包内的同名二进制文件,替换完成后该.framework就是支持真机+全类型模拟器的FAT通用框架
三、自动构建脚本(集成到Xcode一键生成)
- 点击项目左下角的+号,选择Cross-platform分类下的Aggregate,创建一个新的Target,命名为UniversalBuild
- 选中新创建的UniversalBuild Target,进入Build Phases标签页,点击左上角+号选择New Run Script Phase
- 在脚本输入框中粘贴以下代码,将第一行的FRAMEWORK_NAME替换为你自己的框架实际名称:
# 替换为你的框架实际名称 FRAMEWORK_NAME="YourFrameworkName" # 通用框架输出路径 UNIVERSAL_OUTPUT_DIR=${SRCROOT}/Build/Universal # 清理旧构建产物 rm -rf ${UNIVERSAL_OUTPUT_DIR} mkdir -p ${UNIVERSAL_OUTPUT_DIR} # 构建真机版本框架 xcodebuild -target "${FRAMEWORK_NAME}" -configuration Release -sdk iphoneos build BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" # 构建模拟器版本框架 xcodebuild -target "${FRAMEWORK_NAME}" -configuration Release -sdk iphonesimulator build BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" # 拷贝真机框架到输出目录 cp -R "${BUILD_DIR}/Release-iphoneos/${FRAMEWORK_NAME}.framework" "${UNIVERSAL_OUTPUT_DIR}/" # 合并真机+模拟器二进制文件 lipo -create -output "${UNIVERSAL_OUTPUT_DIR}/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}" "${BUILD_DIR}/Release-iphoneos/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}" "${BUILD_DIR}/Release-iphonesimulator/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}" # 拷贝Swift模块文件(纯OC框架可删除以下这行) cp -R "${BUILD_DIR}/Release-iphonesimulator/${FRAMEWORK_NAME}.framework/Modules/${FRAMEWORK_NAME}.swiftmodule/" "${UNIVERSAL_OUTPUT_DIR}/${FRAMEWORK_NAME}.framework/Modules/${FRAMEWORK_NAME}.swiftmodule" # 构建完成后自动打开输出目录 open "${UNIVERSAL_OUTPUT_DIR}"
- 配置完成后,顶部运行目标选择UniversalBuild,按下
Command + B即可自动构建并打开通用框架所在的输出目录
内容的提问来源于stack exchange,提问作者iDev
相关产品推荐
相关产品推荐

