创建一个具有 objective c 框架依赖性的胖框架

Creating a fat framework with an objective c framework dependency

我正在使用 Swift 4.2 和 Xcode 10.1。我正在尝试在 Swift 中构建一个框架,该框架依赖于在 Objective C 中编写的 Alamofire。我按照 Alamofire 的自述文件中的说明手动添加了 Alamofire.xcodeproj。个人目标构建良好。我的框架目标构建良好。

当我尝试使用使用以下命令的脚本创建胖框架时出现问题

xcodebuild -project "${FRAMEWORK_NAME}.xcodeproj" -scheme "${FRAMEWORK_NAME}" -configuration "${CONFIGURATION}" -arch arm64 -arch armv7 -arch armv7s only_active_arch=no BITCODE_GENERATION_MODE=bitcode defines_module=yes -sdk "iphoneos" -derivedDataPath "${OUTPUT_DIR}"

我收到以下错误:

umbrella header 'Alamofire.h' not found

could not build Objective-C module 'Alamofire'

错误的第二行来自另一个依赖项 'Moya',它依赖于 Alamofire(见图)

令人费解的是,正常的 Cmd+B 对通常的目标工作正常,但 xcodebuild 失败。

我尝试过的事情:

  1. 正在删除派生文件夹,清理构建。
  2. 首先构建单独的依赖项,然后构建通用聚合目标。
  3. Creating a custom module map
  4. 将所有依赖项的配置更改为相同的,例如调试
  5. 正在将 Alamofire.xcodeproj 的 Swift 语言版本更改为 Swift 4.2

我认为 xcodebuild 命令需要更多输入。我错过了什么?

更新:

我进一步挖掘。 Headers 文件夹 Debug-iphoneos/Alamofire.framework/ 里面是空的,它应该包含伞 header Alamofire.h.

你试过这些吗:

1.Adding -ObjC 在构建设置中 -> Linking -> 其他 Linker 标志。

2.Importing Objective C 框架依赖于您的项目的所有框架,即在构建阶段 --> Link Binary With Libraries .

3.Adding #import 用于前缀头文件,必须在 Prefix Header 字段的构建设置中将其添加到项目中。

更新: 阐述第 3 点:

要在您的 Swift 项目中使用 Objective C 框架,您必须在该项目中创建一个 Swift 桥接头文件。最好的方法是手动创建 .h 文件。

首先,将头文件添加到您的项目中,名称为:MyProjectName-Bridging-Header.h。这将是您导入任何 Objective C 代码的单个头文件,您需要 Swift 代码才能访问。

在您的项目构建设置中找到 Swift 编译器 - 代码生成部分。在项目根文件夹的 Objective C Bridging Header 旁边添加桥接头文件的路径。应该是MyProject/MyProject-Bridging-Header.h

它只需要一个桥接头。在该文件中输入 #import 语句,您的 类 将在您的 Swift 项目代码中可用,无需任何额外的 #import 语句。

你也可以看看这个教程: Integrating objective c in swift

事实证明,嵌套依赖项是一个问题。

MyFramework 依赖于 Moya,Moya 依赖于 Alamofire。在我将 Alamofire.xcodeproj 作为子模块添加到 Moya.xcodeproj 之后,xcodebuild 神奇地正确地找到了所有伞头。