You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构建依赖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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 15:39:36