将Swift Package SDK打包为二进制XCFramework时遇xcodebuild目标指定错误的技术咨询
解决Swift Package导出XCFramework时的xcodebuild目标设备要求问题
我明白你现在的处境——用Swift Package构建XCFramework时遇到了xcodebuild要求指定-destination的错误,而且很多指南都没覆盖Swift Package的场景,确实有点头疼。下面一步步帮你理清问题并解决:
为什么必须指定-destination?
对于Swift Package项目,Xcode的xcodebuild工具不像传统Xcode项目那样有默认的构建目标上下文,它需要明确知道你要针对哪类设备架构进行构建。即使你指定了ARCHS="arm64",工具还是需要一个具体的目标环境来匹配SDK和构建配置,这是Swift Package构建系统的设计要求。
正确的构建命令(兼容iOS 13+)
针对你的需求(iOS 13+所有设备,导出XCFramework),你需要分别构建模拟器和真机架构的产物,然后合并成XCFramework。这里是完整的步骤和命令:
1. 构建真机(arm64)版本
xcodebuild archive \ -scheme [你的Scheme名称] \ -sdk iphoneos \ -configuration Release \ -destination 'generic/platform=iOS' \ -archivePath './Build/iPhoneOS.xcarchive' \ SKIP_INSTALL=NO \ BUILD_LIBRARY_FOR_DISTRIBUTION=YES
2. 构建模拟器(x86_64 + arm64)版本
xcodebuild archive \ -scheme [你的Scheme名称] \ -sdk iphonesimulator \ -configuration Release \ -destination 'generic/platform=iOS Simulator' \ -archivePath './Build/iOSSimulator.xcarchive' \ SKIP_INSTALL=NO \ BUILD_LIBRARY_FOR_DISTRIBUTION=YES
3. 合并成XCFramework
xcodebuild -create-xcframework \ -framework './Build/iPhoneOS.xcarchive/Products/Library/Frameworks/[你的Framework名称].framework' \ -framework './Build/iOSSimulator.xcarchive/Products/Library/Frameworks/[你的Framework名称].framework' \ -output './Build/[你的XCFramework名称].xcframework'
关键参数说明(必填项解析)
这里给你拆解命令里的必填参数,避免混淆:
-scheme:必须指定你的Swift Package的Scheme,通常和Package名称一致,可以用xcodebuild -list查看当前Package的可用Scheme-sdk:指定构建用的SDK,真机用iphoneos,模拟器用iphonesimulator-destination:对于通用构建,用generic/platform=iOS(真机)或generic/platform=iOS Simulator(模拟器)就足够,不需要指定具体设备-archivePath:指定归档文件的输出路径,后续合并XCFramework需要用到这里的产物SKIP_INSTALL=NO:必须设置,否则归档产物不会包含Framework文件BUILD_LIBRARY_FOR_DISTRIBUTION=YES:核心参数,开启后会生成模块的.swiftinterface文件,保证二进制Framework能被Swift项目正确引用,是发布XCFramework的必要条件
兼容iOS 13+的额外配置
要确保SDK兼容iOS 13+,你需要在Swift Package的Package.swift里指定最低部署版本:
let package = Package( name: "你的SDK名称", platforms: [ .iOS(.v13) ], // 其他配置... )
这样构建出来的XCFramework会自动继承这个部署版本要求,不需要在xcodebuild命令里额外指定。
执行完这些步骤后,你的Build文件夹里就会生成包含真机和模拟器架构的XCFramework,完全可以作为二进制包分发给客户,不会暴露源码。
内容的提问来源于stack exchange,提问作者noku09876
相关产品推荐
相关产品推荐

