Xcode 12.3
在我的情况下,我通过在 Build Settings 选项卡中将 Validate Workspace 设置为 Yes 来解决这个问题
https://i.stack.imgur.com/GGKrR.png
毫无疑问,Xcode 12.3 的修复方法是在目标的构建设置中设置 Validate Workspace 属性。但是,如果您在此更改后检查差异,则构建错误的原因是项目文件中缺少参数(VALIDATE_WORKSPACE),而不是参数的值。因此,您不需要该值为 YES。您需要将该值添加到项目设置中,并且可以将其保留为默认值 (NO)。第一次,它在构建设置中显示为 NO,但这只是因为这是缺少参数的默认值。
TLDR;在不更改项目设置的情况下,转到目标的构建设置,找到“验证工作区”,将其设置为“是”,然后设置回“否”。
当我将自定义框架添加到项目中并且更新 Xcode 后,我遇到了同样的问题。
解决方案:在项目的构建设置下搜索验证工作区只需更改为 yes
,默认设置为 no
https://i.stack.imgur.com/IRuzt.png
使用 .xcframework 而不是包含 iOS 和 iOS 模拟器切片的“胖” .framework。这也避免了在为 App Store 构建时使用构建阶段来剥离 iOS 模拟器切片的需要。
不支持通常使用 lipo 创建的“胖”框架,因为它们不能由 Xcode 直接构建(source: Developer Technical Support Apple Developer forum)。 .xcframework 是唯一受支持的机制来发布支持 iOS 和 iOS 模拟器的单一框架。
此外,.xframework 是发布二进制 Swift 框架 (source: Developer Technical Support on Apple Developer forum) 的唯一受支持方式。
在 Xcode 12.3 中,强制执行“胖”框架不受支持的事实,因为 Xcode 在构建期间验证框架,这就是为什么许多项目突然开始出现构建错误的原因。
这里的大多数答案是让通用二进制文件的消费者绕过新的限制。但是,正如在其他地方所指出的,是时候为框架作者迁移到 Apple 的 XCFramework
格式了。
如果您之前使用聚合目标和 lipo
运行自定义构建脚本来创建通用二进制文件,则可以直接迁移到生成 .xcframework
文件
首先,在构建设置中确保“构建库以供分发”(BUILD_LIBRARY_FOR_DISTRIBUTION
) 设置为 YES
然后,将您现有的使用 lipo
的聚合目标构建脚本替换为类似以下内容的内容,这对于展示如何仅制作“发布”框架很简单:
# Universal Script
set -e
FRAMEWORK_NAME="your_framework_name"
IOS_SCHEME_NAME="your_scheme_name"
if [ -d "${SRCROOT}/build" ]; then
rm -rf "${SRCROOT}/build"
fi
SIMULATOR_ARCHIVE_PATH="${SRCROOT}/build/${FRAMEWORK_NAME}-iphonesimulator.xcarchive"
DEVICE_ARCHIVE_PATH="${SRCROOT}/build/${FRAMEWORK_NAME}-iphoneos.xcarchive"
OUTPUT_DIR="${SRCROOT}/framework_out_universal/"
# Simulator xcarchieve
xcodebuild archive \
-scheme ${IOS_SCHEME_NAME} \
-archivePath ${SIMULATOR_ARCHIVE_PATH} \
-configuration Release \
-sdk iphonesimulator \
SKIP_INSTALL=NO
# Device xcarchieve
xcodebuild archive \
-scheme ${IOS_SCHEME_NAME} \
-archivePath ${DEVICE_ARCHIVE_PATH} \
-sdk iphoneos \
-configuration Release \
SKIP_INSTALL=NO
# Clean up old output directory
rm -rf "${OUTPUT_DIR}"
# Create xcframwork combine of all frameworks
xcodebuild -create-xcframework \
-framework ${SIMULATOR_ARCHIVE_PATH}/Products/Library/Frameworks/${FRAMEWORK_NAME}.framework \
-framework ${DEVICE_ARCHIVE_PATH}/Products/Library/Frameworks/${FRAMEWORK_NAME}.framework \
-output ${OUTPUT_DIR}/${FRAMEWORK_NAME}.xcframework
# Delete the most recent build.
if [ -d "${SRCROOT}/build" ]; then
rm -rf "${SRCROOT}/build"
fi
您可以调整上述内容以获得不同的输出目录、不同的删除行为、支持多种配置(发布与调试),但这对我有用。
最后,作为一个时间步骤,删除导致您出现此项目中提到的错误的 your_framework_name.framework
通用二进制文件。复制新建的 your_framework_name.xcframework
并将其添加到项目中,错误应该会消失。
可能的原因是
您使用的框架可能不是为模拟器架构(x86_64)构建的,您可以通过在此路径中转到框架文件夹(framework_name.framework --> modules --->framework_name.swiftModule-->)来检查兼容性,您应该查看 arm/i386/x86_64 支持文件 如果你已经更新到新的 Xcode,你正在使用的框架与新的编译器版本不兼容,所以供应商需要分享最近兼容的,这种情况下你将无法运行在设备和模拟器上
老实说,你们应该遵循的唯一方法是将 .framework 转换为 .xcframework,因为这是 Apple 从 XCode 12.3 及更高版本强制执行的。验证工作区和其他快速修复可能是暂时的,并会在将来导致问题 - 例如存档应用程序以供应用商店发布或测试飞行。
要将 .framework 转换为 .xcframework,请按照文章中描述的步骤,从段落命令开始:https://medium.com/strava-engineering/convert-a-universal-fat-framework-to-an-xcframework-39e33b7bd861
如果您使用 Carthage,请确保使用 copy-frameworks
脚本而不是使用 Embed & Sign
作为嵌入内容。我遇到了同样的错误,因为我忘记了这一点。
我在 Xcode v12.3 和 Universal(fat) Framework
(.framework) 上遇到了这个错误
Building for iOS Simulator, but the linked and embedded framework was built for iOS + iOS Simulator.
解决方案 1:是 Toggle/Toggle Validate Workspace
(非默认)
解决方案 2:使用 XCFramework[About]
我想您要链接的框架仅适用于 arm 架构。您将无法在模拟器中运行它。您将需要框架的作者来构建“通用框架”。
如果您是 Xcode 新手并且使用 Xcode 只是为了启动模拟器以运行 appium
工具,那么上述步骤可能会很复杂。初学者只需使用小于 11 的 xcode
版本。
此链接有助于下载 xcode 10.3
如果您尝试从 AppStore 下载,我们需要有高达 40 GB 的免费存储空间,上述 `xip 文件不会导致存储错误。
如果这可行,你可以稍后感谢我!
Validate Workspace
时,我的错误变成了警告。这是疯狂和不可预测的。也许它没有解决核心问题,但我们只是在 Xcode 中发现了另一个错误?