image.png
第一步:创建组件库 BuildXCFramework
fen@bluesky Example % cd /Users/fen/Desktop/2025/Swift
fen@bluesky Swift % pod lib create BuildXCFramework
Cloning `https://github.com/CocoaPods/pod-template.git` into `BuildXCFramework`.
Configuring BuildXCFramework template.
security: SecKeychainSearchCopyNext: The specified item could not be found in the keychain.
------------------------------
To get you started we need to ask a few questions, this should only take a minute.
If this is your first time we recommend running through with the guide:
- https://guides.cocoapods.org/making/using-pod-lib-create.html
( hold cmd and double click links to open in a browser. )
What platform do you want to use?? [ iOS / macOS ]
> iOS
Possible answers are [ iOS / macOS ]
> iOS
What language do you want to use?? [ Swift / ObjC ]
> swift
Would you like to include a demo application with your library? [ Yes / No ]
> yes
Which testing frameworks will you use? [ Quick / None ]
> none
Would you like to do view based testing? [ Yes / No ]
> no
podspec新增
s.static_framework = true // 默认情况下,CocoaPods 使用动态 framework, 静态framework会合并进最终的ipa二进制文件,提高启动速度,xcframework依赖静态库
s.pod_target_xcconfig = { 'BUILD_LIBRARY_FOR_DISTRIBUTION' => true } // 生成 .swiftinterface 以支持多个 Swift 版本
第二步:制作Shell脚本
#!/bin/bash
TARGETNAME='BuildXCFramework'
WORK_TYPE="project" # project 或 workspace
SCHEME_NAME="BuildXCFramework"
SCRIPT_PATH=$(cd `dirname $0`; pwd)
SRCROOT=${SCRIPT_PATH}/Pods
WORK_PATH=${SRCROOT}/${TARGETNAME}
rm -rf ${SCRIPT_PATH}/build
BUILD_ROOT=${SCRIPT_PATH}/build
CONFIGURATION="Debug" # Debug Release
mkdir ${SCRIPT_PATH}/build
echo "🚀 开始创建 ${TARGETNAME}.xcframework"
INSTALL_DIR=${SRCROOT}/Products/${TARGETNAME}.framework
DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${TARGETNAME}/${TARGETNAME}.framework
DEVICE_SWIFTMODULE_DIR=${DEVICE_DIR}/"Modules"/${TARGETNAME}".swiftmodule"
SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${TARGETNAME}/${TARGETNAME}.framework
SIMULATOR_SWIFTMODULE_DIR=${SIMULATOR_DIR}/"Modules"/${TARGETNAME}".swiftmodule"
echo "🚀 开始编译真机设备"
xcodebuild archive -project "${SRCROOT}/Pods.xcodeproj" \
-scheme $SCHEME_NAME \
-configuration ${CONFIGURATION} \
-destination 'generic/platform=iOS' \
-archivePath "../archives/$SCHEME_NAME.framework-iphoneos.xcarchive" \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES || { echo "❌ 真机设备编译失败"; exit 1; }
echo "🚀 开始编译模拟器设备"
xcodebuild archive -project "${SRCROOT}/Pods.xcodeproj" \
-scheme $SCHEME_NAME \
-configuration ${CONFIGURATION} \
-destination 'generic/platform=iOS Simulator' \
-archivePath "../archives/${SCHEME_NAME}.framework-iphonesimulator.xcarchive" \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES || { echo "❌ 模拟器设备编译失败"; exit 1; }
# 确保 swiftinterface 存在
echo "📂 检查 swiftinterface 是否生成..."
ls -la "../archives/$SCHEME_NAME.framework-iphoneos.xcarchive/Products/Library/Frameworks/$SCHEME_NAME.framework/Modules/$SCHEME_NAME.swiftmodule/"
ls -la "../archives/$SCHEME_NAME.framework-iphonesimulator.xcarchive/Products/Library/Frameworks/$SCHEME_NAME.framework/Modules/$SCHEME_NAME.swiftmodule/"
# 重新创建 xcframework
if [ -d "../${SCHEME_NAME}.xcframework" ]; then
rm -rf "../${SCHEME_NAME}.xcframework"
fi
echo "🚀 生成 xcframework..."
xcodebuild -create-xcframework \
-framework "../archives/${SCHEME_NAME}.framework-iphoneos.xcarchive/Products/Library/Frameworks/${SCHEME_NAME}.framework" \
-framework "../archives/${SCHEME_NAME}.framework-iphonesimulator.xcarchive/Products/Library/Frameworks/${SCHEME_NAME}.framework" \
-output "../${SCHEME_NAME}.xcframework" || { echo "❌ xcframework 生成失败"; exit 1; }
echo "🚀 🎉 ${TARGETNAME}.xcframework 制作成功"
将制作好的Shell, 放入Example目录下
第三步:切换xcFramework和源码
在podspec中通过subspec来控制
s.subspec 'xcFramework' do |sf| # 二进制依赖
sf.vendored_framework = "BuildXCFramework.xcframework"
end
s.subspec 'Source' do |sc| # 源码
sc.source_files = "BuildXCFramework/Classes/**/*"
end
s.default_subspecs = 'xcFramework'
第四步: Pod中调用
pod 'BuildXCFramework' , :path => '../' # 默认使用 xcframework
# pod 'BuildXCFramework/xcFramework', :path => '../' # 使用xcFramework
# pod 'BuildXCFramework/Source', :path => '../' # 使用源码
# pod 'BuildXCFramework', :path => '../', :subspecs => ["xcFramework"] # 使用xcFramework
补充
验证架构
fen@bluesky Example % lipo -info /Users/fen/Desktop/2025/Swift/BuildXCFramework/BuildXCFramework.xcframework/ios-arm64/BuildXCFramework.framework/BuildXCFramework
Non-fat file: /Users/fangyangdebeiduofen/Desktop/2025/Swift/BuildXCFramework/BuildXCFramework.xcframework/ios-arm64/BuildXCFramework.framework/BuildXCFramework is architecture: arm64
脚本参数Configuration区别
截屏2025-02-12 18.18.52.png
swiftinterface 是什么?BUILD_LIBRARY_FOR_DISTRIBUTION
swiftinterface 是 Swift 的模块稳定性(Module Stability) 机制的一部分,它不是废弃的技术,而是 Swift 官方为了解决跨 Swift 版本兼容性问题而推出的。
BUILD_LIBRARY_FOR_DISTRIBUTION = YES开启swiftinterface稳定性,无需匹配swift版本,不然升级还需要重新处理
s.static_framework = true的作用
将 CocoaPods 生成的 framework 作为静态 framework,而不是默认的动态 framework。
✅ 适合的场景:
• 封装 SDK(私有 pod、第三方库)
• 减少动态库加载,提高启动速度
• 解决多个 Pods 依赖相同动态库的冲突
• Swift 代码的 framework,避免符号冲突
❌ 不适合的场景:
• 如果你的库依赖其他动态 framework
• 如果你的 pod 需要被动态链接