首页 > 解决方案 > 如何使用 FIT C++ 库构建 iOS 框架

问题描述

我正在尝试为 FIT C++libFitSdkCppiOS.a库创建一个 Swift 包装器,但我真的不知道如何混合使用 C++、Objective-C 和 Swift 代码来进行设置。

这是我到目前为止所做的: 1. 为 FITFramework 创建了一个新目标 2. 将libFitSdkCppiOS.a库和相关的 cpp 头文件复制到 Xcode 中的目标文件夹中 3. 因为你不能Bridging-Header在我正在尝试的框架中使用文件弄清楚下一步该怎么做。

我看过一些关于称为伞头的帖子,但不知道那是什么或需要在其中做什么才能使其正常工作。有人可以逐步解释我需要做什么来创建这个 Swift Wrapper 并将其打包为一个可供其他项目使用的框架。

  1. 伞头文件是主要框架头文件,在这种情况下称为FITFramework.h?
  2. 如果不是,我如何创建一个伞头文件,它需要在哪里?
  3. 伞头文件中应该包含什么?

FITFramework.h

//
//  FITFramework.h
//  FITFramework
//
//  Created by xxxx xxxxxxx on 7/6/18.
//

#import <UIKit/UIKit.h>

//! Project version number for FITFramework.
FOUNDATION_EXPORT double FITFrameworkVersionNumber;

//! Project version string for FITFramework.
FOUNDATION_EXPORT const unsigned char FITFrameworkVersionString[];

// In this header, you should import all the public headers of your framework using statements like #import <FITFramework/PublicHeader.h>

编辑: 1. 如何在不使用 Bridging-Header 文件的情况下将 Objective-C 类公开给 Swift?

有几篇文章提到了 module.map 文件的使用,但这似乎是将 C 标头而不是 Objective-C 标头暴露给 Swift 包装函数

标签: iosframeworks

解决方案


好的,我想通了——很难找到任何好的或准确的指南。我将在别处更详细地写下来,并在某个时候添加一个链接。

与此同时 - 假设你的框架是调用XXXFramework- 你需要:

在文件夹中创建一个XXXFrameworkPrivate子目录,其中XXXFramework包含一个module.modulemap文件

像这样将私有标头添加到module.modulemap文件中

module FitFrameworkPrivate {
    header "../XXX.h"
    header "../YYY.h"
    header "../ZZZ.h"
    export *
}

XXX.xcconfig使用以下行 创建一个文件SWIFT_INCLUDE_PATHS = $(SRCROOT)/XXXFramework/XXXFrameworkPrivate

设置项目配置以使用此配置文件进行调试和发布

将此行添加到您的 Swift 类

进口XXXFrameworkPrivate

基本上,这允许 Swift 类从文件中导入头module.modulemap文件,而不是使用不能在框架中使用的 Bridging-Header 文件。

但请注意 - 我在 C++ 类、Objective-C 类和 Swift 类之间有回调,如果您的公共类使用协议与私有 Obj-C 类之一进行通信,这会产生问题。为了避免这种情况,添加另一个与 Swift 包装器对话的公共 Swift 类,并且只有一个公共类。

如果有人有更好的方法,请告诉我。


推荐阅读