Expo构建iOS版本未更新,TestFlight提交失败求助
问题场景
我有一个预构建完成的Expo应用,使用命令npx expo prebuild -p ios && eas build -p ios构建iOS包,Expo控制台显示构建版本为999.0.0(12),但提交到App Store Connect时收到错误:
Error: Asset validation failed This bundle is invalid. The value for key CFBundleShortVersionString [1.0] in the Info.plist file must contain a higher version than that of the previously approved version [40.2.0]
已完成的排查操作:
- 确认本地Info.plist中
CFBundleShortVersionString值为999.0.0而非1.0 - 将
package.json的version字段修改为999.0.0 - 在
app.json中设置expo.version为999.0.0、expo.ios.buildNumber为12 - 在Xcode的target中手动配置版本号和构建号
每次修改后都重新执行prebuild,但提交时仍被检测到版本为1.0。
我的app.json配置如下:
{ "expo": { "name": "name", "slug": "name", "version": "999.0.0", "orientation": "portrait", "icon": "./assets/images/icon.png", "userInterfaceStyle": "automatic", "splash": { "image": "./assets/images/splash.png", "resizeMode": "contain", "backgroundColor": "#ffffff" }, "assetBundlePatterns": [ "**/*" ], "ios": { "supportsTablet": true, "bundleIdentifier": "xxx.xxxxx.xxxxxx", "buildNumber": "12" }, "extra": { "supportsRTL": false, "oneSignalAppId": "xxxxxxx", "router": { "origin": false }, "eas": { "build": { "experimental": { "ios": { "appExtensions": [ { "targetName": "OneSignalNotificationServiceExtension", "bundleIdentifier": "xxxxxxx", "entitlements": { "com.apple.security.application-groups": [ "xxxxxxxx" ] } } ] } } }, "projectId": "xxxx" } } }, "react-native-google-mobile-ads": { "android_app_id": "ca-xxx-xx-xxx~xxxx", "ios_app_id": "ca-xxx-xxx-xxxx~xxx" } }
更新:手动在Xcode中修改shortVersion和buildNumber后直接上传,成功提交,推测问题出在EAS CLI或远程构建流程中。
针对性解决步骤
1. 清理EAS远程构建缓存
EAS远程构建可能缓存了旧的配置或产物,导致新版本号不生效,执行以下命令清除缓存:
eas build:clear-cache
之后重新执行构建命令。
2. 同步App Extension的版本配置
你的项目中配置了OneSignalNotificationServiceExtension,EAS构建时可能仅更新了主应用版本,而Extension的版本仍沿用旧值,导致上传时校验失败。在app.json的ios.appExtensions中添加版本配置:
"appExtensions": [ { "targetName": "OneSignalNotificationServiceExtension", "bundleIdentifier": "xxxxxxx", "version": "999.0.0", "buildNumber": "12", "entitlements": { "com.apple.security.application-groups": [ "xxxxxxxx" ] } } ]
添加后重新执行prebuild和eas build。
3. 构建时强制指定版本参数
在执行eas build时直接传入版本号参数,强制覆盖远程配置:
eas build -p ios --version 999.0.0 --build-number 12
4. 检查eas.json中的硬编码配置
如果项目存在eas.json,确认其中的iOS构建配置没有硬编码版本号,避免覆盖app.json的设置:
{ "build": { "production": { "ios": { // 移除或修改这里的硬编码版本号 // "version": "1.0", // "buildNumber": "1" } } } }
内容的提问来源于stack exchange,提问作者dynexx

