【问题标题】:How to hide private module of iOS Framework?如何隐藏 iOS 框架的私有模块?
【发布时间】:2020-05-15 08:55:09
【问题描述】:

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

据我所知,我需要使用 Modules 系统才能使 Obj-CSwift 一起工作。

所以我做了什么:

1) 我创建了module.modulemap

2) 我创建了module.private.modulemap

3) 我将DEFINES_MODULE 设置为YES

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 中设置某种参数吗?

2) 正如我上面所说,我的计划是构建一个带有Obj-Cguts 和 Swift 顶层的框架,因此我并不需要一个伞头,我只需要定义一个私有模块,以便 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 公共 API 文件作为总括标头包含在内?

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

【问题讨论】:

    标签: ios objective-c swift private ios-frameworks


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2019-11-14
      • 2016-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-16
      • 1970-01-01
      • 2013-01-26
      • 2013-11-12
      相关资源
      最近更新 更多