【问题标题】:"Building for iOS, but the embedded framework 'xxx.framework' was built for iOS + iOS Simulator"“为 iOS 构建,但嵌入式框架 'xxx.framework' 是为 iOS + iOS 模拟器构建的”
【发布时间】:2020-12-15 06:19:43
【问题描述】:

升级到 Xcode 12.3 时,出现错误:

Building for iOS, but the embedded framework 'opus.framework' was built for iOS + iOS Simulator

但更新前一切正常。

【问题讨论】:

  • 对我来说同样的问题!
  • 临时解决方法(对我有用)是使用旧版构建系统 stackoverflow.com/a/54058682
  • 如果您使用的是 Cocoapods,有一个解决方法。通过 cocoapods 分发的框架不是直接嵌入的,并且目标完整性检查不会“看到”它们。因此,您可以将您的框架打包为本地 pod:1)创建 podspec 并引用框架 spec.public_header_files = "YourFramework.framework/Headers/*.h" spec.source_files = "YourFramework/Headers/*.h" spec.vendored_frameworks = "YourFramework" 2)从 podfile 引用框架
  • [stackoverflow.com/questions/65303304/… 为我工作!谢谢@TomKnapen

标签: ios xcode12


【解决方案1】:

Xcode Build Settings

尝试将“构建设置”中“构建选项”的“验证工作区”设置为“是”会有所帮助。

【讨论】:

  • 对于 M1 Mac,在 Rosetta + 以上选项中打开对我有帮助
  • 我的已经设置为“否”了,还是会出现这个错误。
【解决方案2】:

编辑:这是一个可以帮助使用 Carthage 的人的观察结果。

显然this 回答中描述的这个问题最流行的解决方案。

在 Build Settings 选项卡中将 Validate Workspace 设置为 Yes

另外,观察this的答案是正确的

恐怕这实际上是正确的错误和框架 不应同时包含 iOS 和 iOS 模拟器代码。苹果 试图强迫我们为此目的使用 XCFramework。他们开始了 在 XCode 11 中,只是收紧了限制。

在即将到来的 Xcode 版本中,所有其他解决方案(除了 xcframework 使用)似乎都变得越来越临时。


如果您使用的是 Carthage 并且您添加了带有 Embed & Sign 的框架,则会出现此问题。

要使其正常工作,您必须遵循 Carthage 页面提供的 steps

如果您正在为 iOS、tvOS 或 watchOS 构建

  1. 创建一个 Cartfile,列出您想在项目中使用的框架。

  2. 运行carthage update。这会将依赖项提取到 Carthage/Checkouts 文件夹中,然后构建每个依赖项或下载一个 预编译框架。

  3. 打开您的应用程序目标的常规设置选项卡。对于 Xcode 11.0 及更高版本,在“框架、库和嵌入式内容”部分中,从 磁盘上的 Carthage/Build 文件夹。然后,在“嵌入”部分, 从添加的每个项目的下拉菜单中选择“不嵌入”。为了 Xcode 10.x 及更低版本,在“链接的框架和库”中 部分,从 磁盘上的 Carthage/Build 文件夹。

  4. 在应用程序目标的 Build Phases 设置选项卡上,单击 + 图标并选择 New Run Script Phase。创建一个运行脚本,在其中指定您的 shell(例如:/bin/sh),添加以下内容 内容到 shell 下面的脚本区域:

    /usr/local/bin/carthage copy-frameworks
    
  5. 创建一个名为 input.xcfilelist 的文件和一个名为 output.xcfilelist 的文件

  6. 将要使用的框架的路径添加到input.xcfilelist。例如:

    $(SRCROOT)/Carthage/Build/iOS/Result.framework
    $(SRCROOT)/Carthage/Build/iOS/ReactiveSwift.framework
    $(SRCROOT)/Carthage/Build/iOS/ReactiveCocoa.framework
    
  7. 将复制的框架的路径添加到output.xcfilelist。例如:

    $(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/Result.framework
    $(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/ReactiveSwift.framework
    $(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/ReactiveCocoa.framework
    

    在输入文件旁边指定输出文件时,Xcode 只需要在输入文件发生更改或 输出文件丢失。这意味着脏构建会更快 你还没有用 Carthage 重建框架。

  8. input.xcfilelist 添加到 Carthage 运行脚本阶段的“输入文件列表”部分

  9. output.xcfilelist 添加到 Carthage 运行脚本阶段的“输出文件列表”部分

也许这也是对其他情况的临时修复。 (不是用 Carthage 构建的依赖项)

【讨论】:

  • 我遇到了 OP 的问题,但我使用的是 CocoaPods 而不是 Carthage
  • 对我也一样。不使用迦太基。
  • 这个问题发生在不管迦太基。
  • @IgorGanapolsky 我将我的编辑移到了答案的顶部。原始答案解决了使用 Carthage 时发生的类似问题。
猜你喜欢
  • 2021-05-30
  • 1970-01-01
  • 2020-07-07
  • 2020-11-25
  • 1970-01-01
  • 2022-01-08
  • 2020-09-08
  • 1970-01-01
  • 2022-06-23
相关资源
最近更新 更多