PAYATHON 2026

React Native iOS 启动时报“No script URL provided”怎么办?

数据阿明

结论

这条报错表示 iOS 应用启动时没有获取到 JavaScript bundle 的 URL。常见原因包括 Metro 未运行、应用采用了不合适的构建配置,或打包时没有将 bundle 放进应用。现有信息还不足以判断具体原因。

你之前在 AppDelegate.swift 中遇到的 No such module expo 是编译阶段的模块导入错误;现在的 No script URL provided 则表示应用启动时找不到 JavaScript bundle。两者可能有关联,但目前无法确认它们有相同的根因。

先确认是 Debug 还是 Release

在 Xcode 中检查当前选中的 scheme 和 Build Configuration:

  • Debug:通常从 Metro 加载 JavaScript。先在项目根目录启动开发服务器:

    npx expo start --dev-client

    Metro 启动后,再从 Xcode 运行 iOS 应用。如果使用模拟器或真机,确认设备可以连接运行 Metro 的开发电脑。

  • Release:应用通常需要包含打包后的 JavaScript。检查 Xcode target 的 Build Phases,确认 React Native 的 bundle 构建阶段存在并成功执行。脚本会因 React Native 和 Expo 的集成方式而异,建议先对照当前项目以及 React Native 0.81.5、Expo SDK 54 对应的模板。

如果通过 Expo 命令运行 bare 项目,可以试试:

npx expo run:ios

这可以帮助确认 Expo 的本地运行流程能否启动项目。Xcode Release 打包阶段仍需单独检查。

检查 iOS 的 bundle URL 配置

查看 AppDelegate.swift 中提供 JavaScript bundle URL 的实现,确认 Debug 构建能从开发服务器获取 URL,Release 构建能指向应用内的 bundle。升级 React Native 或 Expo 后,AppDelegate 的集成代码可能需要与当前模板保持一致。核对项目当前结构前,不要直接替换成固定代码。

同时确认运行的是刚构建的 target 和 scheme,并查看 Xcode 构建日志,检查 bundle 阶段是否执行、是否报错。如果使用 expo-updates,也要检查项目的更新配置是否影响启动时的 bundle 加载路径。

处理依赖诊断

当前 Expo Doctor 报告了重复的原生模块依赖和 SDK 版本不匹配。这些问题不能单独证明是本次报错的原因,但值得先处理,因为 iOS 构建会将原生依赖编入应用。

检查 SDK 54 建议的包版本:

npx expo install --check

根据检查结果对齐 Expo 相关包版本,再处理 react-native-device-info 的多个版本和两个不同版本的 expo-constants。先确认哪些直接依赖引入了旧版本,再通过升级、替换或调整依赖树解决。确认兼容性后再决定是否固定版本。完成后重新安装 Pods 并重建 iOS:

cd ios
pod install

诊断还指出项目有原生目录,且 app.config.js 配置了原生属性。对于已有 ios/ 目录的 bare 项目,需确认原生工程已同步所需配置。不要只为消除诊断提示就覆盖原生目录。

关于 _arm64_ 排除设置

排除架构通常无法解决 bundle URL 缺失。如果该设置是为处理之前的编译问题而添加,检查它现在是否仍有明确用途。在 Apple Silicon 环境中排除 arm64 还可能影响本机模拟器构建。是否保留,应根据具体依赖和构建错误判断。

建议的排查顺序

  1. 确认报错出现在 Debug 还是 Release 构建。
  2. Debug 下启动 Metro,并检查设备与开发服务器的连接。
  3. Release 下检查 Xcode 的 bundle 构建阶段和构建日志。
  4. 核对 AppDelegate.swift 中的 bundle URL 实现是否符合当前项目的集成方式。
  5. 根据 expo install --check 的结果对齐 SDK 54 依赖,清理重复的原生模块后重建。

如果以上步骤仍无法定位问题,请补充完整的 iOS 启动日志、Xcode scheme 和构建配置,以及 bundle 构建阶段的日志。根据这些信息,才能进一步判断问题出在 Metro 连接、原生配置还是打包过程。

备注:内容仅供参考。