Xcode 14中xcodebuild归档iOS Simulator报错:找不到通用目标
问题
使用xcodebuild脚本编译用于其他Xcode项目的Framework,需归档全架构版本。升级Xcode 14后,iOS Simulator的归档命令报错,但必须支持模拟器编译以方便开发者测试。
执行的归档命令:
xcodebuild archive -scheme <TargetName> -destination 'generic/platform=iOS Simulator' -archivePath <ArchivePath> SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
报错信息:
xcodebuild: error: Unable to find a destination matching the provided destination specifier: { generic:1, platform:iOS Simulator }
其他平台(watchOS、iOS、watchOS Simulator)的同类命令均可正常执行,仅iOS Simulator失败。查看xcodebuild输出的可用目标列表,发现watchOS Simulator有通用占位条目:
{ platform:watchOS Simulator, id:dvtdevice-DVTiOSDeviceSimulatorPlaceholder-watchsimulator:placeholder, name:Any watchOS Simulator Device
但iOS Simulator没有对应的通用条目,请问这是否是问题根源?如果是,如何添加通用iOS Simulator目标?如果不是,问题出在哪里?
完整xcodebuild命令输出:
Command line invocation: /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild archive -scheme <SCHEME> -destination "generic/platform=iOS Simulator" -archivePath Archiver/<archive-name>.xcarchive SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES User defaults from command line: IDEArchivePathOverride = /<directory>/<archive-name>.xcarchive IDEPackageSupportUseBuiltinSCM = YES Build settings from command line: BUILD_LIBRARIES_FOR_DISTRIBUTION = YES SKIP_INSTALL = NO 2022-10-03 16:18:52.358 xcodebuild[17449:3179785] Writing error result bundle to /var/folders/lj/n7mj7ccd3dd4fds0x_0jh0w00000gn/T/ResultBundle_2022-03-10_16-18-0052.xcresult xcodebuild: error: Unable to find a destination matching the provided destination specifier: { generic:1, platform:iOS Simulator } Available destinations for the <scheme-name> scheme: { platform:macOS, arch:x86_64, variant:Mac Catalyst, id:41E4E96D-C631-58DB-8E17-3556BF095CE6 } { platform:iOS, id:dvtdevice-DVTiPhonePlaceholder-iphoneos:placeholder, name:Any iOS Device } { platform:macOS, variant:Mac Catalyst, name:Any Mac } { platform:watchOS, id:dvtdevice-DVTiOSDevicePlaceholder-watchos:placeholder, name:Any watchOS Device } { platform:watchOS Simulator, id:dvtdevice-DVTiOSDeviceSimulatorPlaceholder-watchsimulator:placeholder, name:Any watchOS Simulator Device } { platform:watchOS Simulator, id:8B93893B-58A9-4BD5-BC84-D78DF46E3737, OS:8.5, name:38mm } { platform:watchOS Simulator, id:9A39430C-1550-4B53-8665-B3E8E3DD437C, OS:7.0, name:AWSE 40mm 7.0 } { platform:watchOS Simulator, id:85EAEDB9-281C-4C42-BB07-D381344B4F01, OS:9.0, name:Apple Watch SE (44mm) (2nd generation) } { platform:watchOS Simulator, id:7B667533-D65F-4206-A077-2D58CF319030, OS:7.0, name:Apple Watch Series 3 - 38mm } { platform:watchOS Simulator, id:2F0A6761-237E-46FE-B44B-FA5E11FD4A21, OS:7.0, name:Apple Watch Series 3 - 42mm } { platform:watchOS Simulator, id:EFEEDC25-E85E-4168-B6F3-96F8298A8E6E, OS:7.0, name:Apple Watch Series 4 - 40mm } { platform:watchOS Simulator, id:1525C7D5-CF81-47EA-8D4F-9B26AFB66BF8, OS:7.0, name:Apple Watch Series 4 - 44mm } { platform:watchOS Simulator, id:56F2E561-28F1-442D-BEB9-ED1877717760, OS:7.0, name:Apple Watch Series 4 - 44mm } { platform:watchOS Simulator, id:A8C716BF-F1D3-4516-BB49-5E91363DBB5F, OS:7.0, name:Apple Watch Series 5 - 40mm } { platform:watchOS Simulator, id:0656A4DC-9185-45D6-AE1C-17FAD1B1D0A7, OS:8.5, name:Apple Watch Series 5 - 40mm } { platform:watchOS Simulator, id:698CCD93-B788-4DDA-90AC-07661A9629B6, OS:9.0, name:Apple Watch Series 5 - 40mm } { platform:watchOS Simulator, id:730D0366-0323-4F3F-996A-561FC0E9AAFC, OS:7.0, name:Apple Watch Series 5 - 44mm } { platform:watchOS Simulator, id:3023177A-19DD-4F96-A73E-197259BC272C, OS:8.5, name:Apple Watch Series 5 - 44mm } { platform:watchOS Simulator, id:11510526-D5DC-434C-A90B-3BBC200CF8FB, OS:9.0, name:Apple Watch Series 5 - 44mm } { platform:watchOS Simulator, id:754F83EC-91F0-4256-B8E1-0D3C61BA7FF8, OS:8.5, name:Apple Watch Series 6 - 40mm } { platform:watchOS Simulator, id:13A6B166-22FF-438A-812A-B6950C75F962, OS:9.0, name:Apple Watch Series 6 - 40mm } { platform:watchOS Simulator, id:0C669787-AE31-4A05-AA8C-EED110A2263A, OS:8.5, name:Apple Watch Series 6 - 44mm } { platform:watchOS Simulator, id:A08AFD03-D2A2-4174-BEE1-86251CE83B5A, OS:9.0, name:Apple Watch Series 6 - 44mm } { platform:watchOS Simulator, id:84E1B07A-C242-40A3-AD7A-3B71149261A8, OS:8.5, name:Apple Watch Series 7 - 41mm } { platform:watchOS Simulator, id:D5774F1B-7970-45E8-AEE1-966BD0230D94, OS:9.0, name:Apple Watch Series 7 - 41mm } { platform:watchOS Simulator, id:6F1E4CFD-E60B-4BA0-BDB9-CB7B3C27CBD2, OS:8.5, name:Apple Watch Series 7 - 45mm } { platform:watchOS Simulator, id:5D127481-A881-4702-825C-AD30F6E70985, OS:9.0, name:Apple Watch Series 7 - 45mm } { platform:watchOS Simulator, id:2162F742-53DB-4DC1-8E99-DC3008123038, OS:9.0, name:Apple Watch Series 8 (41mm) } { platform:watchOS Simulator, id:9DE0C9A0-AEF3-49DB-BA48-F4E3CF0A6192, OS:9.0, name:Apple Watch Series 8 (45mm) } { platform:watchOS Simulator, id:5B5B40C5-2161-48FF-8042-F5035079BA2C, OS:9.0, name:Apple Watch Ultra (49mm) } { platform:iOS Simulator, id:46D15E87-293B-4180-BC8E-C9B3C791486E, OS:16.0, name:iPhone 8 } { platform:iOS Simulator, id:8EBBAB0A-67C8-4B7C-BED3-00CF2E3DEB29, OS:16.0, name:iPhone 8 Plus } { platform:iOS Simulator, id:86F72120-9578-494B-A2B8-8307A3B60992, OS:16.0, name:iPhone 11 } { platform:iOS Simulator, id:4E7ACBF2-D991-49FF-A949-EBF206620640, OS:16.0, name:iPhone 11 Pro } { platform:iOS Simulator, id:C944E87A-D90A-4436-9CF1-13697A9A20E0, OS:16.0, name:iPhone 11 Pro Max } { platform:iOS Simulator, id:6C88747D-A158-4299-8FE3-D5A14274AD65, OS:16.0, name:iPhone 12 } { platform:iOS Simulator, id:A1C762C1-586A-4F3E-BD5E-D1107A7A3DC5, OS:16.0, name:iPhone 12 Pro } { platform:iOS Simulator, id:DC323D96-0FB9-4804-821B-6B300989071A, OS:16.0, name:iPhone 12 Pro Max } { platform:iOS Simulator, id:3713AE79-E945-4437-9543-EDEADD55A20F, OS:16.0, name:iPhone 12 mini } { platform:iOS Simulator, id:43D651EB-53C5-4DB1-B768-A96A0D995551, OS:16.0, name:iPhone 13 } { platform:iOS Simulator, id:68F75521-508F-41B7-995E-738A67C0F69C, OS:16.0, name:iPhone 13 Pro } { platform:iOS Simulator, id:9335E9C2-BB1E-4746-9717-7E78801AD169, OS:16.0, name:iPhone 13 Pro Max } { platform:iOS Simulator, id:7BC5CAAC-D23C-45B4-A714-ECEB6C2439A1, OS:16.0, name:iPhone 13 mini } { platform:iOS Simulator, id:06242371-CE14-49AC-A16A-981EC1AC308D, OS:16.0, name:iPhone 14 } { platform:iOS Simulator, id:969BE080-BD61-4C30-8EBB-F8CD6C754986, OS:16.0, name:iPhone 14 Plus } { platform:iOS Simulator, id:595D8F66-C0F1-4854-8C17-C30035E04D0A, OS:16.0, name:iPhone 14 Pro } { platform:iOS Simulator, id:5BD654A4-2983-4C5C-B869-33FCDDED3492, OS:16.0, name:iPhone 14 Pro Max } { platform:iOS Simulator, id:CC7BF3A6-62CB-4AC3-9E13-ED20DA1CC9E0, OS:16.0, name:iPhone SE (3rd generation) }
解决方案
问题根源
是的,问题核心就是Xcode 14移除了iOS Simulator的通用占位目标(Any iOS Simulator Device),导致generic/platform=iOS Simulator的目标无法匹配到可用设备。
替代方案
无需手动添加通用目标,直接修改归档命令即可,以下三种方案任选:
方案1:指定具体模拟器设备
从xcodebuild输出的可用目标中选择一个具体的iOS Simulator设备,比如iPhone 14,修改命令如下:
xcodebuild archive -scheme <TargetName> -destination 'platform=iOS Simulator,name=iPhone 14,OS=16.0' -archivePath <ArchivePath> SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
也可以直接使用设备ID:
xcodebuild archive -scheme <TargetName> -destination 'platform=iOS Simulator,id=06242371-CE14-49AC-A16A-981EC1AC308D' -archivePath <ArchivePath> SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
方案2:直接指定架构编译
跳过destination参数,通过ARCHS参数直接指定模拟器需要的架构(x86_64对应Intel Mac,arm64对应Apple Silicon Mac):
xcodebuild archive -scheme <TargetName> -sdk iphonesimulator ARCHS="x86_64 arm64" -archivePath <ArchivePath> SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
这种方式不依赖具体设备,直接针对模拟器SDK编译全架构版本。
方案3:修改项目设置后简化命令
在Xcode项目的Build Settings中,将Valid Architectures设置为包含x86_64和arm64,然后使用简化命令:
xcodebuild archive -scheme <TargetName> -sdk iphonesimulator -archivePath <ArchivePath> SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
验证
编译完成后,可通过以下命令查看Framework的架构是否符合要求:
lipo -info <FrameworkPath>
输出应包含x86_64和arm64两种架构。
内容的提问来源于stack exchange,提问作者Bocaxica

