自定义混合Swift与Obj-C类的CocoaPods编译失败问题求助
问题根因
苹果官方明确不支持在开启Build Libraries for Distribution(用于生成Swift接口文件.swiftinterface,供二进制分发使用)的Framework中使用桥接头文件。桥接头文件仅适用于单App Target的混编场景,CocoaPod作为Framework类型的组件,应该使用Module机制实现Swift与Objective-C的互调。
完整解决方案
1. 移除桥接头文件配置
- 删除原有的桥接头文件,同时在Pod的target配置中清空
Objective-C Bridging Header的配置项
2. 配置Objective-C代码暴露给Swift调用
- 将需要暴露给Swift调用的OC头文件,全部放到Pod的
umbrella header(即Pod的公开头文件,和.podspec里s.public_header_files配置项对应)中 - 在你的.podspec中添加配置,开启Module支持:
s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' } - 配置完成后Swift侧不需要额外导入,直接调用暴露的OC类、方法即可
3. 配置Swift代码暴露给Objective-C调用
- 所有需要暴露给OC调用的Swift类、方法都需要添加
@objc修饰符,继承自NSObject的类可以直接加@objcMembers修饰符批量暴露成员 - 编译Pod后会自动生成
{PodName}-Swift.h头文件,在需要调用Swift代码的OC文件中导入该头文件即可:#import <PodName/PodName-Swift.h>
4. 开启库分发配置
配置完成后将Build Libraries for Distribution设置为YES,重新执行xcodebuild命令即可正常编译,同时生成对应的.swiftinterface文件。
常见问题校验
- 如果出现OC找不到
{PodName}-Swift.h的报错,确认DEFINES_MODULE已经设置为YES,且Swift代码已经添加了正确的@objc修饰 - 如果Swift找不到OC类,确认对应的OC头文件已经加入到umbrella header的公开头文件列表中,没有被标记为私有头
内容的提问来源于stack exchange,提问作者Thomas D Cat
相关产品推荐
相关产品推荐

