如何隐藏iOS框架的私有模块?

How to hide private module of iOS Framework?

我有一个 code-base,它由 Swift top-layer 组成,意思是 public API 和 Objective-C "guts" 我需要将它很好地包装到 iOS .framework 中,这样其他开发人员就可以在不窃取 Intellectual 属性.

的情况下采用我的解决方案

据我所知,我需要使用模块系统才能使 Obj-CSwift 协同工作。

所以我做了什么:

1) 我创建了 module.modulemap

2) 我创建了 module.private.modulemap

3) 我将 DEFINES_MODULE 设置为 YES

4) 我将 Swift 的 Import Paths 设置为两个模块映射所在的框架文件夹。

这是我的 module.modulemap 的样子:

framework module CoolSDK {
  umbrella header "/full/path/to/file/MyUmbrella.h"

  export *
  module * { export * }
}

这是我的 module.private.modulemap 的样子:

module CoolSDK_Private [extern_c] {
      header "/full/path/to/file/ObjC-Guts.h"

      export *
}

我有多个问题:

1) 为什么我需要在模块中设置文件的完整路径?当我尝试像 header "file.h" 这样设置名称时,我收到一条错误消息,指出找不到文件。我确信我尝试包含的文件位于模块中。我可以在 Build settings 中设置某种参数吗?

2) 正如我上面所说,我的计划是构建一个具有 Obj-C 胆量和 Swift 顶层的框架,因此我真的不需要保护伞 header,我只需要定义一个私有模块,这样 Swift 部分就可以访问 Obj-C 部分(有点像我们用 Bridging-Header 做的一样,但是当涉及到框架时,它不是一个选项)。遇到这种情况怎么办?如果我完全删除 module.modulemap,XCode 会生成它自己的 module.modulemap,如下所示:

module CoolSDK.Swift {
    header "CoolSDK-Swift.h"
    requires objc
}

当然我有一个错误 CoolSDK-Swift.h can not be found,所以我认为这不是一个选择。我是否应该将我的 Swift public API 文件作为保护伞 header?

3) 虽然我的框架构建成功并且框架的 Modules 文件夹中没有 module.private.modulemap 这正是我需要的(通过 private 隐藏任何 Obj-C 胆量的迹象模块),我仍然能够像这样 import CoolSDK.Private 在我的 SDK 测试中访问私有模块。我怎样才能使这个模块在框架范围内成为例外,并且不允许用户访问我的私有模块?

如你所知,我放弃了在框架内混合 Swift 和 Objective-C 代码库的想法。我将所有 Swift 部分转换为 Objective-C,之后我能够应用不同的做法来隐藏私有代码。