【发布时间】:2020-05-15 08:55:09
【问题描述】:
我有一个代码库,它由 Swift 顶层组成,它是公共 API 和 Objective-C “胆量”,我需要将它很好地包装到 iOS .framework 中,以便其他开发人员可以合并我的解决方案而不窃取知识产权。
据我所知,我需要使用 Modules 系统才能使 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-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