如何嵌入依赖于架构的框架

How to embed framework which depends on architecture

我的 iOS 项目依赖于一些 CustomLib.framework。这个框架有两个独立的文件:一个用于模拟器,另一个用于真实设备。

我把这些文件放到文件夹里

@(PROJECT_DIR)/device_frameworks/CustomLib.framework

@(PROJECT_DIR)/simulator_frameworks/CustomLib.framework

我编辑了

Build Settings->Search paths->Framework search paths:

Any iOS Simulator SDK     $(PROJECT_DIR)/simulator_frameworks
Any iOS SDK               $(PROJECT_DIR)/device_frameworks

我不明白的是如何将CustomLib.framework添加到Xcode项目中,以及如何将其添加为嵌入式框架(Build phases->Embed frameworks)。因为在这些步骤中我必须指定一个具体的框架,但我在 device_frameworkssimulator_frameworks 文件夹中有两个单独的框架。

xcode 中无法根据架构包含它们,但 Apple 引入了 2019 XCFrameworks 作为新的代码分发格式。

来自 XCode 11 release notes:

An XCFramework makes it possible to bundle a binary framework or library for multiple platforms —including iOS devices, iOS simulators, and Mac Catalyst — into a single distributable .xcframework bundle that your developers can use within their own applications.

您可以使用它将这两个框架捆绑为一个,将其添加到您的项目中,并且 Xcode 在构建时使用包含的框架或库的正确平台版本。

您可以使用以下命令从终端创建 XCFramework:

xcodebuild -create-xcframework -framework PATH_TO_FRAMEWORK1 -framework PATH_TO_FRAMEWORK2 -output PATH_TO_BUNDLED_FRAMEWORK

其中 PATH_TO_FRAMEWORK1PATH_TO_FRAMEWORK2 是框架的路径,PATH_TO_BUNDLED_FRAMEWORK 是生成的 XCFramework 的路径。

假设您在项目目录中,命令可能如下所示:

xcodebuild -create-xcframework -framework device_frameworks/CustomLib.framework -framework simulator_frameworks/CustomLib.framework -output BundledCustomLib.xcframework

那么您只需要将 BundledCustomLib.xcframework 添加到您的项目中。