ChatGPT解决这个技术问题 Extra ChatGPT

为 iOS 模拟器构建,但链接框架“****.framework”是为 iOS 构建的

我不能再在模拟器上运行我的应用程序了。在线建议我编辑我的 project.pbxproj,但这似乎不起作用。我如何重新获得在我的模拟器上运行我的项目的能力(并且仍然能够在设备上这样做)?我正在开发另一个使用许多相同框架的项目,但它在模拟器上运行。什么会导致类似的框架在一个项目中工作但在另一个项目中不起作用?

也可能与您的苹果开发者帐户有关。您是付费项目还是组织的一部分?
我是一个组织的一员,并安装了工作生产临时配置文件。

R
RunesReader

Xcode 12.3

在我的情况下,我通过在 Build Settings 选项卡中将 Validate Workspace 设置为 Yes 来解决这个问题

https://i.stack.imgur.com/GGKrR.png


毫无疑问,这是我的+1,它救了我。但老实说,你们是如何弄清楚如何解决这类问题的?!你的思考过程是什么?
它也救了我。它发生在我将 XCode 更新到 12.3 时,但这修复了它
有人可以解释它为什么起作用吗?当我更改 Validate Workspace 时,我的错误变成了警告。这是疯狂和不可预测的。也许它没有解决核心问题,但我们只是在 Xcode 中发现了另一个错误?
查看 Validate Workspace 的选项,我们有 No、Yes 和 Yes(错误),将 Validate Workspace 设置为 Yes(错误)会出现此错误,将其设置为 Yes 会出现警告,将其设置为 No 会完全忽略此问题.在我看来,他们将默认值更改为是(错误)。
根本问题可能是您的工作区无效,因为您正在链接一个预先构建的“胖”.framework,其中包含 iOS 和 iOS 模拟器切片,而不是 .xcframework。 Xcode 不支持前者。在 Xcode 12.3 中,由于现在根据此标准验证框架,并且验证工作区默认设置更改为“是(错误)”(?),您会看到此错误。关于 .xcframework,请参阅我的回答 stackoverflow.com/a/65417883/3727099 了解更多详细信息。
f
flyerz

毫无疑问,Xcode 12.3 的修复方法是在目标的构建设置中设置 Validate Workspace 属性。但是,如果您在此更改后检查差异,则构建错误的原因是项目文件中缺少参数(VALIDATE_WORKSPACE),而不是参数的值。因此,您不需要该值为 YES。您需要将该值添加到项目设置中,并且可以将其保留为默认值 (NO)。第一次,它在构建设置中显示为 NO,但这只是因为这是缺少参数的默认值。

TLDR;在不更改项目设置的情况下,转到目标的构建设置,找到“验证工作区”,将其设置为“是”,然后设置回“否”。


是的!这是正确的,我必须将它从 No 切换到 Yes 然后再切换回 No 才能正常工作。我不再更新 Xcode...每次我都必须浪费至少一天时间来修复我的项目,以便它们再次编译。
s
sta

当我将自定义框架添加到项目中并且更新 Xcode 后,我遇到了同样的问题。

解决方案:在项目的构建设置下搜索验证工作区只需更改为 yes,默认设置为 no

https://i.stack.imgur.com/IRuzt.png


是的,它正在工作,但为什么我们这样做了。你能告诉我一点关于这个是什么意思。如果是和不是呢?谢谢!
当 validate workspace 设置为 YES 时,它会在构建应用程序时检查工作区配置,如果设置为 NO 则跳过该部分
好的工作空间意味着可可豆荚和所有东西!正确的?
是的,这也包括框架。当我开始作为 ios 开发人员的职业生涯时,我看过你的 youtube 视频,我很想看你的英文教程,因为我不懂印地语 :)
哦哇!我打算用英语创建一个新的新鲜频道。没想到你在看我的频道。谢谢兄弟 :-) 意义重大。
g
guru_meditator

使用 .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 在构建期间验证框架,这就是为什么许多项目突然开始出现构建错误的原因。


m
mistahenry

这里的大多数答案是让通用二进制文件的消费者绕过新的限制。但是,正如在其他地方所指出的,是时候为框架作者迁移到 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 并将其添加到项目中,错误应该会消失。


n
nca

可能的原因是

您使用的框架可能不是为模拟器架构(x86_64)构建的,您可以通过在此路径中转到框架文件夹(framework_name.framework --> modules --->framework_name.swiftModule-->)来检查兼容性,您应该查看 arm/i386/x86_64 支持文件 如果你已经更新到新的 Xcode,你正在使用的框架与新的编译器版本不兼容,所以供应商需要分享最近兼容的,这种情况下你将无法运行在设备和模拟器上


T
Timothy Stokarski

老实说,你们应该遵循的唯一方法是将 .framework 转换为 .xcframework,因为这是 Apple 从 XCode 12.3 及更高版本强制执行的。验证工作区和其他快速修复可能是暂时的,并会在将来导致问题 - 例如存档应用程序以供应用商店发布或测试飞行。

要将 .framework 转换为 .xcframework,请按照文章中描述的步骤,从段落命令开始:https://medium.com/strava-engineering/convert-a-universal-fat-framework-to-an-xcframework-39e33b7bd861


K
Kyle

如果您使用 Carthage,请确保使用 copy-frameworks 脚本而不是使用 Embed & Sign 作为嵌入内容。我遇到了同样的错误,因为我忘记了这一点。


我正在使用复制框架,但仍然在 Xcode 12.5 上收到此错误。任何线索?
y
yoAlex5

我在 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]


如果您在构建设置中没有验证工作区设置,您会怎么做?
选择构建设置下的所有选项卡。您还将看到验证工作区设置
s
shim

我想您要链接的框架仅适用于 arm 架构。您将无法在模拟器中运行它。您将需要框架的作者来构建“通用框架”。


该框架是 cocoapod 的编译,主要由 Firebase pod 以及 SDWebImage 和其他一些组成。我是否必须恢复到 Xcode 11.3 或使用旧版本?为什么这个错误在它工作了一年多的时候就开始发生了?
S
Shankar Ganesh Jayaraman

如果您是 Xcode 新手并且使用 Xcode 只是为了启动模拟器以运行 appium 工具,那么上述步骤可能会很复杂。初学者只需使用小于 11 的 xcode 版本。

此链接有助于下载 xcode 10.3

Xcode10.3

如果您尝试从 AppStore 下载,我们需要有高达 40 GB 的免费存储空间,上述 `xip 文件不会导致存储错误。

如果这可行,你可以稍后感谢我!