在Expo托管工作流中集成原生iOS Mapbox导航SDK的问题(不依赖第三方包)
在Expo托管工作流中集成原生iOS Mapbox导航SDK的问题(不依赖第三方包)
看起来你已经搞定了不少前置工作——配置了处理Info.plist的Config Plugin,甚至成功跑通了Hello World级的Swift原生模块,但卡在了Mapbox导航SDK的SPM集成上对吧?报错提示找不到MapboxDirections模块,核心原因是Expo托管工作流会自动覆盖iOS项目文件,手动在Xcode里加的SPM依赖会被清空,而且你的原生模块代码没有关联到正确的SPM包。下面咱们一步步解决这个问题:
一、用Config Plugin自动添加SPM依赖(关键!)
手动在Xcode里添加的SPM包会在下次expo prebuild或expo run:ios时被彻底覆盖,所以必须用Expo Config Plugin来自动把Mapbox的SPM依赖注入到生成的Xcode项目中。
1. 编写SPM集成的Config Plugin
创建一个新的Config Plugin文件withMapboxSPM.js,内容如下:
const { withXcodeProject } = require('@expo/config-plugins'); function addMapboxSPMDependencies(project) { // 添加Mapbox导航SDK的SPM远程仓库(主仓库包含所有必需的子模块) const mapboxNavigationPackage = project.addSwiftPackageProduct({ url: 'https://github.com/mapbox/mapbox-navigation-ios.git', requirement: { kind: 'upToNextMajorVersion', minimumVersion: '2.12.0', // 替换成你需要的稳定版本 }, productName: 'MapboxNavigation', }); // 找到你的Expo原生模块Target(替换成你实际的模块名,比如expo-mapbox-nav) const expoModuleTarget = project.pbxTargetByName('expo-mapbox-nav'); if (expoModuleTarget) { // 把Mapbox的SPM产品关联到你的原生模块Target project.addTargetDependency(expoModuleTarget, mapboxNavigationPackage); } console.log('✅ Mapbox SPM依赖已成功注入Xcode项目'); } const withMapboxSPM = (config) => { return withXcodeProject(config, (config) => { const project = config.modResults; addMapboxSPMDependencies(project); return config; }); }; module.exports = withMapboxSPM;
2. 合并两个Config Plugin到项目配置
在app.json或app.config.js中,将之前的withMapboxToken和新的withMapboxSPM都加入plugins数组:
{ "expo": { "plugins": [ "./plugins/withMapboxToken", "./plugins/withMapboxSPM" ] } }
二、再次验证核心环境配置
.netrc文件检查:确保
~/.netrc里的Mapbox私有密钥配置完全正确(这是SPM拉取Mapbox私有包的唯一凭证),格式必须是:machine api.mapbox.com login mapbox password sk_你的私有访问密钥(注意是sk开头,不是pk公钥)环境变量有效性:确保
MAPBOX_PUBLIC_TOKEN(pk开头的公钥)能被Expo正确读取。你可以在终端先临时导出:export MAPBOX_PUBLIC_TOKEN=pk_你的公钥内容或者用
dotenv管理,在项目根目录创建.env文件存储变量,再在app.config.js中加载。
三、清理缓存并重新构建
之前的构建缓存可能残留错误配置,咱们彻底清理后重新构建:
# 删除自动生成的项目文件和Expo缓存 rm -rf ios android .expo # 清除CocoaPods缓存 pod cache clean --all # 重新预构建并运行到设备 npx expo prebuild --clean npx expo run:ios --device <你的设备名称>
常见问题排查
- 版本不兼容:如果你的Expo SDK版本低于48,Config Plugin的Xcode操作API可能有差异,建议升级到Expo SDK 48+再尝试。
- SPM拉取失败:如果Xcode提示无法拉取Mapbox包,检查
.netrc密钥是否正确,或者网络能否正常访问Mapbox的GitHub仓库。 - 模块导入错误:如果仍提示找不到模块,检查你的Swift文件导入语句是否和SPM产品名一致(比如
import MapboxDirections对应SPM的MapboxDirections产品),同时确认Config Plugin中指定的Target名称和你的原生模块Target完全匹配。
内容来源于stack exchange




