如何在Swift Package Manager中导入已编译的Objective-C Framework
SPM 集成已编译 Objective-C XCFramework 操作指南
前置检查
首先确认你使用的ObjCFramework.xcframework本身结构合规:每个平台切片对应的.framework包内的Modules目录下是否已经存在module.modulemap文件。如果已存在且配置正确,你无需额外修改配置,直接在Swift代码中执行import ObjCFramework即可正常调用接口。
无内置Modulemap的处理方案
如果第三方Framework没有内置模块映射文件,按以下步骤配置:
1. 调整包目录结构
在你的Swift目标源代码目录(默认路径为Sources/MySPM)下新建两个文件:
include/MySPMUmbrella.h:伞头文件,用于引入所有需要暴露的OC接口module.modulemap:自定义模块配置
2. 编写伞头文件
在MySPMUmbrella.h中引入OC Framework的所有公开头:
// 替换为你实际需要引入的OC头文件路径 #import <ObjCFramework/ObjCFramework.h> #import <ObjCFramework/XXXTool.h>
3. 编写模块映射文件
在module.modulemap中添加以下内容:
module MySPM { umbrella header "MySPMUmbrella.h" export * link framework "ObjCFramework" }
4. 修正Package.swift配置
给你的Swift目标添加头文件搜索路径、编译定义和链接配置:
targets: [ .target( name: "MySPM", dependencies: ["ObjCFramework"], cSettings: [ // 替换为对应XCFramework头文件的相对路径(相对于Sources/MySPM目录) .headerSearchPath("../../Frameworks/ObjCFramework.xcframework/Headers", .when(platforms: [.iOS, .macOS])), .define("OBJC_MODULES", to: "1") ], linkerSettings: [ .linkedFramework("ObjCFramework") ] ), .binaryTarget(name: "ObjCFramework", path: "Frameworks/ObjCFramework.xcframework") ]
常见问题排查
- 所有路径配置注意大小写匹配,SPM对大小写敏感
- 不需要单独声明独立的ObjCFramework模块,直接将OC接口暴露到你的Swift包模块下即可调用
- 如果报头文件找不到错误,调整
headerSearchPath的相对路径到正确位置即可
内容的提问来源于stack exchange,提问作者Pankaj Gaikar
相关产品推荐
相关产品推荐

