首页 > 解决方案 > 如何隐藏 iOS 框架的私有模块?

问题描述

我有一个代码库,它由 Swift 顶层组成,它是公共 API 和 Objective-C “胆量”,我需要将它很好地包装到 iOS 中.framework,以便其他开发人员可以在不窃取知识产权的情况下整合我的解决方案。

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

所以我做了什么:

1)我创建module.modulemap

2)我创建module.private.modulemap

3)我设置DEFINES_MODULEYES

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

这是我的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吗?

( _ Obj-C_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公共 API 文件作为总括标头包含在内?

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

标签: iosobjective-cswiftprivateios-frameworks

解决方案


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


推荐阅读