【Swift】Swift组件使用xcframework记录

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 需要被动态链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容