You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

在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 prebuildexpo 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.jsonapp.config.js中,将之前的withMapboxToken和新的withMapboxSPM都加入plugins数组:

{
  "expo": {
    "plugins": [
      "./plugins/withMapboxToken",
      "./plugins/withMapboxSPM"
    ]
  }
}

二、再次验证核心环境配置

  1. .netrc文件检查:确保~/.netrc里的Mapbox私有密钥配置完全正确(这是SPM拉取Mapbox私有包的唯一凭证),格式必须是:

    machine api.mapbox.com
      login mapbox
      password sk_你的私有访问密钥(注意是sk开头,不是pk公钥)
    
  2. 环境变量有效性:确保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

火山引擎 最新活动