为 iOS 模拟器构建,但链接框架“****.framework”是为 iOS 构建的
Posted
技术标签:
【中文标题】为 iOS 模拟器构建,但链接框架“****.framework”是为 iOS 构建的【英文标题】:Building for iOS Simulator, but the linked framework '****.framework' was built for iOS 【发布时间】:2020-11-25 18:58:03 【问题描述】:我不能再在模拟器上运行我的应用程序了。在线建议我编辑我的 project.pbxproj,但这似乎不起作用。我如何重新获得在我的模拟器上运行我的项目的能力(并且仍然能够在设备上这样做)?我正在开发另一个使用许多相同框架的项目,但它在模拟器上运行。什么会导致类似的框架在一个项目中工作但在另一个项目中不起作用?
【问题讨论】:
也可能与您的苹果开发者帐户有关。您是付费项目还是组织的一部分? 我是一个组织的一员,并且安装了工作生产临时配置文件。 【参考方案1】:我想您要链接的框架仅适用于 arm 架构。您将无法在模拟器中运行它。您将需要框架的作者来构建“通用框架”。
【讨论】:
该框架是 cocoapods 的汇编,主要由 Firebase pods 以及 SDWebImage 和其他一些组成。我必须恢复到 Xcode 11.3 还是使用旧版本?为什么这个错误在它运行了一年多之后就开始出现了?【参考方案2】:可能的原因是
-
您使用的框架可能不是为模拟器架构(x86_64)构建的,您可以通过转到框架文件夹(framework_name.framework --> modules --->framework_name.swiiftModule-->)来检查兼容性您应该看到 arm/i386/x86_64 支持文件的路径
如果你更新到新的Xcode,你使用的框架与新的编译器版本不兼容,所以供应商需要分享最近兼容的,这种情况下你将无法在设备和模拟器上运行
【讨论】:
【参考方案3】:Xcode 12.3
在我的例子中,我通过在 Build Settings 选项卡中将 Validate Workspace 设置为 Yes
解决了这个问题【讨论】:
毫无疑问这是我的+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,请参阅我的回答 ***.com/a/65417883/3727099 了解更多详情。【参考方案4】:
毫无疑问,Xcode 12.3 的修复方法是在目标的构建设置中设置 Validate Workspace 属性。但是,如果您在此更改后检查差异,构建错误的原因是项目文件中缺少参数 (VALIDATE_WORKSPACE),而不是参数的值。 所以您不需要该值为 YES。您需要将该值添加到项目设置中,并且可以将其保留为默认值 (NO)。第一次,它在 Build Settings 中显示为 NO,但这只是因为这是缺少参数的默认值。
TLDR; 在不更改项目设置的情况下,转到目标的构建设置,找到 “Validate Workspace”,将其设置为 YES,然后设置回 NO .
【讨论】:
是的!这是正确的,我必须将它从 No 切换到 Yes,然后再次切换回 No 才能正常工作。我不再更新 Xcode...每次我都必须浪费至少一天的时间来修复我的项目,以便它们再次编译。【参考方案5】:使用 .xcframework 而不是包含 iOS 和 iOS 模拟器切片的“胖”.framework。 这也避免了在为 App Store 构建时使用构建阶段来剥离 iOS 模拟器切片的需要。
不支持通常使用 lipo 创建的“Fat”框架,因为它们不能由 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 在构建期间验证框架,这就是为什么很多项目突然开始出现构建错误的原因。
【讨论】:
【参考方案6】:如果您是 Xcode 的新手并且使用 Xcode 只是为了启动模拟器以运行appium
工具,上述步骤可能会很复杂。初学者只需使用小于 11 的xcode
版本即可。
此链接帮助下载xcode 10.3
Xcode10.3
如果您尝试从 AppStore 下载,我们需要有高达 40 GB 的免费存储空间,上述 `xip 文件不会导致存储错误。
如果这行得通,你可以稍后感谢我!
【讨论】:
【参考方案7】:这里的大多数答案是让通用二进制文件的消费者绕过新的限制。但是,正如在其他地方所指出的,是时候为框架作者迁移到 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
并将其添加到项目中,错误应该会消失。
【讨论】:
【参考方案8】:当我将自定义框架添加到项目中时发生了这种情况,并且在更新我的 Xcode 后,我遇到了同样的问题。
解决方案:在项目的构建设置下搜索 Validate workspace Just
更改为yes
,默认设置为no
【讨论】:
是的,它正在工作,但为什么我们这样做了。你能告诉我一点关于这个是什么意思。如果是和不是呢?谢谢! 当验证工作空间设置为 YES 时,它会在构建应用程序时检查工作空间配置,如果设置为 NO 则跳过该部分 ok 工作区意味着可可豆荚和所有东西!对吗? 是的,这也包括框架。当我开始作为 ios 开发人员的职业生涯时,我看过你的 youtube 视频,我很想看你的英文教程,因为我不懂印地语 :) 哇哦!我打算用英语创建一个新的新鲜频道。没想到你在看我的频道。谢谢兄弟 :-) 意义重大。【参考方案9】:说实话,你们应该遵循的唯一方法是将 .framework 转换为 .xcframework,因为这是 Apple 从 XCode 12.3 及更高版本强制执行的。验证工作区和其他快速修复可能是暂时的,并会在未来导致问题 - 例如归档应用以供应用商店发布或测试飞行。
要将 .framework 转换为 .xcframework,请按照文章中描述的步骤,从段落命令开始: https://medium.com/strava-engineering/convert-a-universal-fat-framework-to-an-xcframework-39e33b7bd861
【讨论】:
【参考方案10】:我在 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
(非默认)
方案二:使用XCFramework[About]
【讨论】:
构建设置中没有验证工作区设置怎么办? 选择构建设置下的所有选项卡。您还将看到验证工作区设置【参考方案11】:如果您使用的是Carthage,请确保使用copy-frameworks
脚本而不是使用Embed & Sign
作为嵌入内容。我遇到了同样的错误,因为我忘记了。
【讨论】:
我正在使用复制框架,但我仍然在 Xcode 12.5 上收到此错误。有什么线索吗?以上是关于为 iOS 模拟器构建,但链接框架“****.framework”是为 iOS 构建的的主要内容,如果未能解决你的问题,请参考以下文章
为 iOS 构建,但在为 iOS 模拟器构建的目标文件中链接,用于架构 arm64
iOS 和犰狳(mach-o,但不是为 iOS 模拟器构建的)
Siphon 为 iOS 模拟器构建,但在设备构建时出现链接器错误
为 iOS 模拟器构建,但在为 iOS 构建的目标文件中链接,用于架构 arm64