【问题标题】:How do I build an iOS Framework with the FIT C++ library如何使用 FIT C++ 库构建 iOS 框架
【发布时间】:2018-11-16 21:39:30
【问题描述】:

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

这是我到目前为止所做的: 1. 为 FITFramework 创建了一个新目标 2.将libFitSdkCppiOS.a库和相关的cpp头文件复制到Xcode中的targets文件夹中 3. 因为你不能在 Frameworks 中使用 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 文件的情况下向 Swift 公开 Objective-C 类?

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

【问题讨论】:

    标签: ios frameworks


    【解决方案1】:

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

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

    XXXFramework 文件夹中创建一个XXXFrameworkPrivate 子目录,其中包含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 类,并且只有一个公共类。

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

    【讨论】:

      【解决方案2】:

      非常感谢!这个答案对我非常有用,因为我遇到了类似的问题(将 c fit sdk 而不是 c++ fit sdk 集成到 macOS 和 iOS 应用程序的 swift 框架中)

      我将添加我必须做的以下步骤,以防它帮助某人:

      在使用 Pods 的应用程序中使用该框架时,我无法包含“Private”框架(这是必要的,因为它包含转换为 swift 常量的 c 常量,如 FIT_MESG_XXX)并且 xcconfig 由 Pods 框架设置.编辑 Pod xcconfig 有效,但显然很糟糕。

      最终,我发现您可以使用 #include 创建一个新的 xconfig,然后在您想要使用的外部应用程序中使用它(这与构建框架所需的 xcconfig 是分开的)

      #include "../Pods/Target Support Files/Pods-iOSorMac/Pods-iOSorMacOSApp.debug.xcconfig"
      SWIFT_INCLUDE_PATHS="$(SRCROOT)/fit-sdk-swift/RZFitFile/sdk" "$(SRCROOT)/fit-sdk-swift/RZFitFile/src"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-03
        • 2015-08-18
        • 1970-01-01
        • 2011-09-23
        • 2016-05-31
        • 2014-08-13
        • 2016-08-20
        • 1970-01-01
        相关资源
        最近更新 更多