为iOS Simulator构建,但为iOS构建链接框架“ ****。framework”

时间:2020-08-05 14:56:56

标签: ios swift xcode

我无法再在模拟器上运行我的应用。在线建议我编辑我的project.pbxproj,但这似乎不起作用。如何回收在模拟器上运行项目的能力(并保持在设备上运行的能力)?我正在使用另一个使用许多相同框架的项目,但是它在模拟器上运行。是什么会导致类似的框架在一个项目中起作用而在另一个项目中不起作用?

14 个答案:

答案 0 :(得分:95)

Xcode 12.3

就我而言,我通过在“构建设置”标签中将验证工作区设置为“是”来解决了此问题

enter image description here

答案 1 :(得分:15)

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

答案 2 :(得分:14)

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

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

enter image description here

答案 3 :(得分:10)

在这里,大部分的回答是消费者普遍的二进制文件,以解决新的限制。但是,正如其他地方所述,是时候为框架作者迁移到 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

您可以调整上述有不同的输出显示目录,不同的删除行为,支持多种配置(发布版vs调试),但是这对我的作品。

最后,作为一个时间步,删除your_framework_name.framework普遍引起你的错误,如这个项目提二进制。复制新建your_framework_name.xcframework并把它添加到项目和错误应该消失。

答案 4 :(得分:5)

可能的原因是

  1. 您正在使用的
  2. 框架可能不是针对模拟器体系结构(x86_64)构建的,您可以在此转到框架文件夹(framework_name.framework->模块---> framework_name.swiiftModule->)检查兼容性。您应该看到arm / i386 / x86_64支持文件的路径
  3. 如果您已更新到新的Xcode,则所使用的框架与较新的编译器版本不兼容,因此供应商需要共享最新的兼容版本,在这种情况下,您将无法在设备和模拟器上运行

答案 5 :(得分:3)

对于XCODE 12.3最新版本-如果您遇到此问题-

这是一个解决方法

在“构建设置”下-导航至“验证工作区”-将其更改为“是”(默认为“否”)

答案 6 :(得分:3)

Xcode 12.3 充满了问题。 您的选择是:

  1. 使用旧版构建系统 或
  2. 降级到 12.2 不知道苹果是如何发布这种有缺陷的产品

答案 7 :(得分:0)

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

答案 8 :(得分:0)

我需要删除框架,然后再次添加它,它也嵌入了它-以前没有。

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

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

答案 12 :(得分:-1)

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

答案 13 :(得分:-5)

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

此链接有助于下载xcode 10.3

Xcode10.3

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

如果有效,你可以稍后感谢我!!