构建依赖Salesforce Mobile SDK的Swift Package遇Objective-C模块错误
问题描述
尝试构建依赖Salesforce Mobile SDK(MobileSync库)的Swift Package,因官方无对应Swift Package,转而使用MobileSync Pod封装成XCFramework引入。Swift Package可成功构建,但在Swift文件中导入MobileSyncSPM时出现错误:
Could not build Objective-C module MobileSyncSPM
已执行操作
- 创建名为
MobileSyncSPM的框架项目 - 初始化Podfile并添加MobileSync依赖
- 在
MobileSyncSPM.h中导入<MobileSync/MobileSync.h>暴露接口 - 将目标的
Build Libraries for Distribution设为YES - 分别归档iOS真机和模拟器版本:
xcodebuild archive \ -workspace MobileSyncSPM.xcworkspace \ -scheme MobileSyncSPM \ -configuration Debug \ -destination 'generic/platform=iOS' \ -archivePath './build/MobileSyncSPM.framework-iphoneos.xcarchive' \ SKIP_INSTALL=NO \ BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
xcodebuild archive \ -workspace MobileSyncSPM.xcworkspace \ -scheme MobileSyncSPM \ -configuration Debug \ -destination 'generic/platform=iOS Simulator' \ -archivePath './build/MobileSyncSPM.framework-iphonesimulator.xcarchive' \ SKIP_INSTALL=NO \ BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
- 生成XCFramework:
xcodebuild -create-xcframework \ -framework './build/MobileSyncSPM.framework-iphoneos.xcarchive/Products/Library/Frameworks/MobileSyncSPM.framework' \ -framework './build/MobileSyncSPM.framework-iphonesimulator.xcarchive/Products/Library/Frameworks/MobileSyncSPM.framework' \ -output './build/MobileSyncSPM.xcframework'
- 将XCFramework放入Swift Package的Sources目录,在
Package.swift中添加binaryTarget:
targets: [ .target( name: "MyUtils", dependencies: [ .byName(name: "MobileSyncSPM") ] ), .binaryTarget(name: "MobileSyncSPM", path: "Sources/MyUtils/MobileSyncSPM.xcframework"), .testTarget( name: "MyUtilsTests", dependencies: ["MyUtils"] ), ]
解决方案
1. 检查XCFramework完整性
- 解压XCFramework,确认真机和模拟器版本的
MobileSyncSPM.framework中包含MobileSync的所有依赖文件(头文件、二进制库等)。MobileSync依赖SalesforceSDKCore等库,需确保这些依赖也被正确打包,或在Swift Package中一并引入。 - 验证
MobileSyncSPM.framework/Headers目录下是否存在MobileSync.h,且路径配置正确。
2. 修正模块映射配置
- 手动检查
MobileSyncSPM.framework/Modules/module.modulemap文件,确保内容正确暴露接口:
framework module MobileSyncSPM { umbrella header "MobileSyncSPM.h" export * module * { export * } }
- 在框架项目的
Build Settings中,将Header Search Paths设置为Pod安装的MobileSync头文件路径(通常为Pods/MobileSync),并勾选Recursive,确保MobileSync头文件能被正确检索。
3. 调整XCFramework存放路径
- 将XCFramework从
Sources/MyUtils目录移至Swift Package根目录下的Frameworks文件夹,修改Package.swift中的路径:
.binaryTarget(name: "MobileSyncSPM", path: "./Frameworks/MobileSyncSPM.xcframework"),
Swift Package的Sources目录用于存放源码,二进制文件放在外部目录更规范,可避免路径解析问题。
4. 统一构建配置
- 归档时改用
Release配置,Debug配置可能包含未优化符号或依赖,导致模块构建失败:
xcodebuild archive \ -workspace MobileSyncSPM.xcworkspace \ -scheme MobileSyncSPM \ -configuration Release \ -destination 'generic/platform=iOS' \ -archivePath './build/MobileSyncSPM.framework-iphoneos.xcarchive' \ SKIP_INSTALL=NO \ BUILD_LIBRARIES_FOR_DISTRIBUTION=YES
- 确认框架项目的
Build Settings中,Defines Module设置为YES,这是Objective-C模块被Swift识别的必要条件。
5. 清理缓存重新构建
- 删除Swift Package的
.build目录和Xcode的Derived Data,重新执行swift build命令。 - 在Xcode中选择
File > Packages > Reset Package Caches,再重新加载包。
内容的提问来源于stack exchange,提问作者atik
相关产品推荐
相关产品推荐

