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

4
我有一个代码库,其中包含一个用于公共API的Swift顶层和Objective-C“内部实现”,我需要将其包装到iOS .framework中,以便其他开发人员可以在不侵犯知识产权的情况下集成我的解决方案。
据我所知,我需要使用模块系统来使Obj-CSwift一起工作。
所以我做了以下几步:
1)我创建了module.modulemap 2)我创建了module.private.modulemap 3)我将DEFINES_MODULE设置为YES 4)我将Swift的Import Paths设置为包含两个modulemaps的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-C核心和Swift顶层的框架,因此我实际上不需要一个组合头文件,我只需要定义一个私有模块,以便Swift部分可以访问Obj-C部分(就像我们使用Bridging-Header一样,但对于框架来说并不是一个选项)。 在这种情况下该怎么办? 如果我完全删除module.modulemap,XCode会生成自己的module.modulemap,它看起来像这样:

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

当然,我遇到了一个错误,即找不到“CoolSDK-Swift.h”,所以我认为这不是一个选项。我应该将我的Swift公共API文件作为Umbrella Header包含吗?
3)虽然我的框架已经成功构建,并且在框架的“Modules”文件夹中没有“module.private.modulemap”,这正是我需要的(通过私有模块隐藏任何Obj-C内部细节),但我仍然能够像这样在我的SDK测试中访问私有模块“import CoolSDK.Private”。如何使此模块对框架范围例外,并且不允许用户访问我的私有模块?
1个回答

1

只是让你知道,我放弃了将Swift和Objective-C代码混合在框架内的想法。我将所有的Swift部分转换成了Objective-C,然后我能够应用不同的实践来隐藏私有代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接