创建具有客观c框架依赖性的胖框架

时间:2019-01-22 07:29:58

标签: objective-c swift alamofire moya dynamic-frameworks

我正在使用Swift 4.2和Xcode 10.1。我试图在Swift中构建一个依赖于目标C编写的Alamofire的框架。我按照README中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}"

我收到以下错误:

  

未找到伞头'Alamofire.h'

     

无法构建Objective-C模块“ Alamofire”

错误的第二行来自另一个依赖Alamofire的依赖项“ Moya”(参见图片)
enter image description here

令人困惑的是,正常的Cmd + B对于通常的目标来说可以正常工作,但是xcodebuild失败。

我尝试过的事情:

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

我认为xcodebuild命令需要更多输入。我想念什么?

更新

我进一步挖掘。标头文件夹 Debug-iphoneos / Alamofire.framework /内部为空,预计将包含伞头Alamofire.h。

2 个答案:

答案 0 :(得分:2)

您尝试过以下任何一种方法吗?

1。在构建设置->链接->其他链接器标记中添加-ObjC。

2。将Objective C框架所依赖的所有框架都导入到您的项目中,即在构建阶段->将二进制文件与库链接。

3。将这些代码的#import添加到前缀头文件中,该文件必须在“前缀头”字段的构建设置中添加到您的项目中。

更新: 阐述点3:

要在Swift项目中使用Objective C Framework,必须在该项目中创建一个Swift Bridging Header文件。最好的方法是手动创建.h文件。

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

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

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

build settings

您也可以看一下本教程: Integrating objective c in swift

答案 1 :(得分:1)

结果证明,嵌套依赖关系是一个问题。

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