我有一个由Swift顶层组成的代码库,这意味着它是公共应用程序接口和Objective-C“内部”,我需要很好地将其包装到iOS .framework中,以便其他开发人员可以在不窃取知识产权的情况下合并我的解决方案。
据我所知,为了让Obj-C和Swift协同工作,我需要使用模块系统。
所以我做了什么:
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 guts和Swift顶层的框架,因此我并不真正需要一个伞形头部,我只需要定义一个私有模块,这样Swift part就可以访问Obj-C part (类似于我们用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 guts的迹象),但我仍然可以在我的SDK测试中访问私有模块,比如so import CoolSDK.Private。我怎样才能使这个模块在框架范围内例外,并且不允许用户访问我的私有模块呢?
发布于 2020-05-13 23:32:03
如你所知,我放弃了在框架中混合Swift和Objective-C代码库的想法。我将我所有的Swift部分转换为Objective-C,之后我能够应用不同的实践来隐藏私有代码。
https://stackoverflow.com/questions/59974216
复制相似问题