我有一个代码库,它由Swift顶层的公共API和Objective-C "内脏 "组成,我需要把它很好地封装到iOS框架中。.framework
以便其他开发者可以在不窃取知识产权的情况下将我的解决方案融入其中。
据我所知,我需要使用模块系统,以使 Obj-C
和 Swift
一起工作。
那么我做了什么呢?
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-C
内脏和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) 虽然我的框架搭建成功了,而且没有任何的 module.private.modulemap
里面 Modules
框架的文件夹,这正是我所需要的(通过私有模块隐藏任何Obj-C内脏的迹象),我仍然能够在我的SDK测试中访问私有模块,就像这样。import CoolSDK.Private
. 我怎样才能使这个模块在框架范围内成为例外,而不允许用户访问我的私有模块?
就像你知道的那样,我放弃了在框架内混合Swift和Objective-C代码库的想法。我把我所有的Swift部分都转换成了Objective-C,之后我就可以应用不同的做法来隐藏私有代码。