如何为有条件地使用正确框架的设备和模拟器正确构建应用程序 不是通用/胖框架

问题描述

已经为设备和模拟器获得了单独的框架,我想集成这些框架以实现所需的功能。 我已经在我的迦太基框架项目中包含了模拟器框架。当我编译我的框架时,我收到以下错误

为 iOS-armv7 构建但尝试链接为 iOS-arm64 构建的文件 架构 armv7 的未定义符号: “OBJcclASS$...”,引用自: ViewController.o 中的 objc-class-ref “OBJcclASS$...”,引用自: DepedencyInjector.o 中的 objc-class-ref ViewController.o 中的 objc-class-ref ld:找不到架构 armv7 的符号 clang:错误链接器命令失败,退出代码为 1(使用 -v 查看调用

参考: https://developer.apple.com/forums/thread/66978 https://developer.apple.com/forums/thread/66978?answerId=215100022#215100022

解决方法

如果您可以选择将两个框架链接在一起,您可以让编译器决定。在这种情况下,您将创建一个 FAT 二进制文件。这意味着:

  • 您将两个框架链接在一起
  • 创建一个 (FAT) 框架
  • 在 Xcode 中将此库链接到您的应用
  • 让编译器决定正确的架构

创建 FAT 二进制文件的命令是:

lipo -create ./Simulator.framework/framework_binary ./Device.framework/framework_binary -output ./Universal

现在您必须复制文件夹 Device.framework 并将其命名为 Universal.framework

将使用 lipo 创建的二进制文件复制到此文件夹中。

然后打开文件 ./Universal.framework/Info.plist 并将字符串 iPhoneSimulator 添加到 CFBundleSupportedPlatforms 数组中。

现在从文件夹 x86_64.swiftdoc 中复制 x86_64.swiftmoduleSimulator.framework/Modules/framework_name.swiftmodule/ 并将它们粘贴到 Universal.framework/Modules/framework_name.swiftmodule/

将创建的通用框架导入到 Xcode 的目标 Embedded Binries 部分,您应该能够编译您的项目。

,

您可以按如下方式构建 XCFramework(从命令行)。

xcodebuild \
    -create-xcframework \
    -framework  "<<path to simulator xcarchive>>/Products/Library/Frameworks/SomeFramework.framework" \
    -framework  "<<path to device xcarchive>>/Products/Library/Frameworks/SomeFramework.framework" \
    -output     "CombinedFramework.xcframework"

您可以添加更多内容并设置各种路径和输出以供您品尝。

不确定这是否有帮助,因为您不是在寻找通用框架,也不确定您如何对其进行分类......