React Native集成CocoaPods后xcworkspace构建缺失main.jsbundle问题
这个问题我之前踩过坑,核心是CocoaPods引入后改变了Xcode的构建逻辑,和直接用xcodeproj的流程有差异,具体原因可以拆解为这几点:
1. RN的默认构建脚本被CocoaPods干扰
直接用xcodeproj时,React Native会自动给项目的Build Phases添加一个**"Bundle React Native code and images"**的脚本,它负责在构建时自动生成main.jsbundle并处理资源。但当你通过CocoaPods创建xcworkspace后,Pod会生成独立的项目配置,这个默认脚本要么没被同步到xcworkspace的主target里,要么被Pod的构建规则覆盖了。
2. 构建工作目录的路径解析出错
xcworkspace的构建工作目录和xcodeproj不一样,导致RN的bundle脚本找不到正确的文件位置——你报错里的SHA-1 for file index.js is not computed就是典型表现:脚本无法定位到index.js,自然没法生成bundle文件。
3. 构建顺序的冲突
用xcworkspace时,Pod依赖的构建可能先于RN的bundle生成脚本执行,或者脚本的执行时机不对,导致需要打包main.jsbundle的时候,文件还没被生成出来。
持久化解决方案(替代手动生成)
手动生成bundle只是临时办法,你可以试试这几个方法让xcworkspace自动完成bundle生成:
检查并恢复Build Phases脚本
打开xcworkspace,选中主App target,进入Build Phases标签页,确认是否存在"Bundle React Native code and images"脚本。如果没有,点击+号选择New Run Script Phase,添加以下内容:export NODE_BINARY=node ../node_modules/react-native/scripts/react-native-xcode.sh注意:
../的路径要根据你的项目结构调整,确保能指向项目根目录下的node_modules文件夹。调整脚本执行顺序
把这个Run Script Phase拖到Compile Sources之后、Copy Bundle Resources之前,这样生成的main.jsbundle能被正确复制到App包中。修复路径变量
在项目的Build Settings里,检查SRCROOT是否指向项目根目录,也可以在Run Script里手动指定:export SRCROOT="${PROJECT_DIR}/.." export NODE_BINARY=node "${SRCROOT}/node_modules/react-native/scripts/react-native-xcode.sh"清理缓存重新构建
执行以下命令清理Pod和Xcode缓存:pod deintegrate pod install然后打开Xcode,点击
Product > Clean Build Folder,再重新尝试archive构建。
内容的提问来源于stack exchange,提问作者Nicolas

