无modulemap的闭源ObjC framework如何在Swift framework中实现互操作
无Modulemap的OC闭源框架接入Swift框架最优方案
比umbrella framework更优的方案是手动为闭源OC框架创建自定义module map,不需要改动原OC框架内容,也不需要构造嵌套的umbrella框架,完全符合苹果的框架开发规范,无上架风险,后续维护成本极低。
实现步骤
步骤1:创建自定义modulemap文件
在你的ExternalSwift.framework项目根目录下新建module.modulemap文件,内容参考如下,替换为你实际的框架名和头路径:
module InternalObjectiveC { // 填写OC框架的伞头路径,若是分散的公开头可以逐行用header "xxx.h"声明 umbrella header "InternalObjectiveC.framework/Headers/InternalObjectiveC.h" export * // 声明自动链接该OC框架,无需额外配置其他链接参数 link framework "InternalObjectiveC" }
如果不需要将InternalObjectiveC暴露给你的Swift框架的外部使用者,可以将模块声明为私有,避免外部误导入和符号冲突:
private module InternalObjectiveC { umbrella header "InternalObjectiveC.framework/Headers/InternalObjectiveC.h" export * link framework "InternalObjectiveC" }
步骤2:配置Xcode项目生效
- 打开ExternalSwift.framework对应的Target配置页,找到
Swift Compiler - Search Paths分组下的Import Paths配置项,添加你刚才存放module.modulemap文件的目录路径,若放在子目录下可勾选Recursive - 确认同一配置页下
Build Settings的Framework Search Paths已经添加了InternalObjectiveC.framework所在的目录路径 - 配置完成后,在你的Swift代码中直接添加
import InternalObjectiveC即可正常调用OC框架暴露的所有类、方法和属性
注意事项
- 厂商提供的OC框架如果头引用是
<InternalObjectiveC/xxx.h>的格式,确保Framework Search Paths配置正确,Xcode可以正常检索到框架下的Headers目录 - 打包对外发布的ExternalSwift.framework时,不需要将自定义的module.map文件打包进产物,也不需要将InternalObjectiveC模块暴露给外部使用者,除非你有明确的对外暴露需求
- 该方案同时支持动态库和静态库类型的OC闭源框架
内容的提问来源于stack exchange,提问作者1ce
相关产品推荐
相关产品推荐

