创建一个具有 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 失败。
我尝试过的事情:
- 正在删除派生文件夹,清理构建。
- 首先构建单独的依赖项,然后构建通用聚合目标。
- Creating a custom module map
- 将所有依赖项的配置更改为相同的,例如调试
- 正在将 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 神奇地正确地找到了所有伞头。
我正在使用 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 失败。
我尝试过的事情:
- 正在删除派生文件夹,清理构建。
- 首先构建单独的依赖项,然后构建通用聚合目标。
- Creating a custom module map
- 将所有依赖项的配置更改为相同的,例如调试
- 正在将 Alamofire.xcodeproj 的 Swift 语言版本更改为 Swift 4.2
我认为 xcodebuild 命令需要更多输入。我错过了什么?
更新:
我进一步挖掘。 Headers 文件夹
你试过这些吗:
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 神奇地正确地找到了所有伞头。