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-clientMetro 启动后,再从 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 还可能影响本机模拟器构建。是否保留,应根据具体依赖和构建错误判断。
建议的排查顺序
- 确认报错出现在 Debug 还是 Release 构建。
- Debug 下启动 Metro,并检查设备与开发服务器的连接。
- Release 下检查 Xcode 的 bundle 构建阶段和构建日志。
- 核对
AppDelegate.swift中的 bundle URL 实现是否符合当前项目的集成方式。 - 根据
expo install --check的结果对齐 SDK 54 依赖,清理重复的原生模块后重建。
如果以上步骤仍无法定位问题,请补充完整的 iOS 启动日志、Xcode scheme 和构建配置,以及 bundle 构建阶段的日志。根据这些信息,才能进一步判断问题出在 Metro 连接、原生配置还是打包过程。
备注:内容仅供参考。
