我有一个代码库,其中包含一个用于公共API的Swift顶层和Objective-C“内部实现”,我需要将其包装到iOS
据我所知,我需要使用模块系统来使
所以我做了以下几步:
1)我创建了
这是我的
这是我的
当然,我遇到了一个错误,即找不到“CoolSDK-Swift.h”,所以我认为这不是一个选项。我应该将我的Swift公共API文件作为Umbrella Header包含吗?
3)虽然我的框架已经成功构建,并且在框架的“Modules”文件夹中没有“module.private.modulemap”,这正是我需要的(通过私有模块隐藏任何Obj-C内部细节),但我仍然能够像这样在我的SDK测试中访问私有模块“import CoolSDK.Private”。如何使此模块对框架范围例外,并且不允许用户访问我的私有模块?
.framework
中,以便其他开发人员可以在不侵犯知识产权的情况下集成我的解决方案。据我所知,我需要使用模块系统来使
Obj-C
和Swift
一起工作。所以我做了以下几步:
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”。如何使此模块对框架范围例外,并且不允许用户访问我的私有模块?