使用Fastlane构建EAS iOS失败:“提取模块接口版本错误”
问题描述
环境信息
- 托管工作流(Managed Workflow)
eas-cli版本为0.60.0
目标
将第三方原生库以npm包形式嵌入Expo托管项目。
现有资源
供应商提供的iOS端(Swift).xcframework文件和Android端.aab文件。
操作步骤
- 使用
npx create-react-native-library命令生成自定义React Native库模板 - 将
.aab和.xcframework文件放入对应目录 - 为双平台编写
Java和Swift实现代码 - 本地构建该库
- 发布到私有GitHub仓库前,在
create-react-native-library生成的example应用中测试,功能正常 - 将RN包发布到仓库并安装到Expo项目中
- 卡住步骤:执行
eas build构建自定义开发客户端时失败
错误信息
❌ (/Users/expo/workingdir/build/app/node_modules/@bridgemoney/react-native-sardine/ios/ReactNativeSardine.swift:2:8) 1 | import Foundation > 2 | import MobileIntelligence | ^ error extracting version from module interface 3 | 4 | @objc(ReactNativeSardine) 5 | class ReactNativeSardine: RCTEventEmitter { ❌ (/Users/expo/Library/Developer/Xcode/DerivedData/BridgeGo-cyholdfvmztnmecppglqrfgqcshq/Build/Intermediates.noindex/ArchiveIntermediates/BridgeGo/BuildProductsPath/Debug-iphoneos/XCFrameworkIntermediates/bridgemoney-react-native-sardine/MobileIntelligence.framework/Modules/MobileIntelligence.swiftmodule/arm64-apple-ios.swiftinterface:1:1) > 1 | // swift-interface-format-version: 1.0 | ^ error extracting version from module interface 2 | // swift-compiler-version: Apple Swift version 5.5.2 (swiftlang-1300.0.47.5 clang-1300.0.29.30) 3 | // swift-module-flags: -target arm64-apple-ios11.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -module-name MobileIntelligence 4 | import AdSupport
▸ ** ARCHIVE FAILED ** ▸ The following build commands failed: ▸ CompileSwift normal arm64 /Users/expo/workingdir/build/app/node_modules/@bridgemoney/react-native-sardine/ios/ReactNativeSardine.swift (in target 'bridgemoney-react-native-sardine' from project 'Pods') ▸ EmitSwiftModule normal arm64 (in target 'bridgemoney-react-native-sardine' from project 'Pods') ▸ CompileSwiftSources normal arm64 com.apple.xcode.tools.swift.compiler (in target 'bridgemoney-react-native-sardine' from project 'Pods') ▸ (3 failures)
补充上下文
- 在
eas.json中使用iOS最新镜像,对应XCode 13.4和Swift 5.6.1 - 本地Mac使用XCode 13.4.1和Swift 5.6.1,测试用example应用编译运行正常
解答
错误含义
这个错误由Swift编译器版本不兼容导致:
- 你使用的
.xcframework是用Swift 5.5.2编译生成的(错误日志中// swift-compiler-version: Apple Swift version 5.5.2可佐证) - EAS构建环境使用的是Swift 5.6.1,高版本编译器无法正确解析低版本生成的Swift模块接口文件,因此抛出"error extracting version from module interface"错误。
本地能正常运行是因为XCode 13.4.1(对应Swift 5.6.1)对低版本生成的模块有向下兼容性,而EAS构建环境的版本校验或兼容逻辑更严格。
解决方法
方法1:获取兼容Swift 5.6.1的XCFramework
直接联系第三方供应商,要求他们用XCode 13.4(对应Swift 5.6.1)重新编译并提供.xcframework文件,替换现有文件后重新打包RN库,再尝试EAS构建。
方法2:调整EAS构建环境的XCode版本
在eas.json中指定与XCFramework编译版本匹配的XCode镜像,比如对应Swift 5.5.2的XCode 13.2.1,修改iOS构建配置的image字段:
{ "build": { "production": { "ios": { "image": "latest-13.2" } } } }
方法3:添加Objective-C桥接层
若无法获取新的XCFramework,可在自定义RN库中添加Objective-C桥接层,通过Objective-C调用Swift的XCFramework,避免直接在Swift代码中导入低版本模块:
- 在RN库的iOS目录创建Objective-C文件(如
SardineBridge.h和SardineBridge.m) - 在桥接文件中导入XCFramework的头文件,封装需要调用的方法
- 在
ReactNativeSardine.swift中导入Objective-C桥接文件,通过它间接调用第三方库功能
这种方法利用Objective-C更好的ABI稳定性,绕过Swift版本兼容问题。
内容的提问来源于stack exchange,提问作者doctorrokter
相关产品推荐
相关产品推荐

