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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,039评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,426评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,417评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,868评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,892评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,692评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,416评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,326评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,782评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,957评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,102评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,790评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,442评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,996评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,113评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,332评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,044评论 2 355

推荐阅读更多精彩内容