ITMS-90725 SDK version issue:Expo 修复方法
作者:Mehdi Azizi
发布于 ,7分钟
ITMS-90725 表示 iOS SDK 太旧。Apple 现要求 Xcode 26:升级到 Expo SDK 54 或更高版本,然后重新构建。
ITMS-90725 是 Apple 对你的构建做的一项自动检查:它表示这个 app 是用比最低要求更旧的 iOS SDK 编译的。截至 2026 年 10 月 15 日,Apple 说明:自 2026 年 4 月 28 日起,提交到 App Store Connect 的 app 必须用 Xcode 26 或更高版本、iOS 26 SDK 编译。用 Expo 的话,关键全在 EAS 的构建镜像:从 Expo SDK 54 开始,默认选用的镜像就自带 Xcode 26。
我的几个 app,Solys、TradaZen 和 Nolera,都在 Expo SDK 57 上,eas.json 里没有强制指定镜像:Xcode 版本由 EAS 自己选。下面讲怎么检查你的项目,以及项目比较老时该怎么办。
ITMS-90725 错误是什么意思?
这条消息的标题是“ITMS-90725: SDK version issue”。它会写出你的 app 用哪个 SDK 编译,然后给出最低要求,以及包含该 SDK 的 Xcode 版本。比如在 Apple 开发者论坛上,2024 年的一条消息开头是这样的:“This app was built with the iOS 16.2 SDK”,后面跟着当时的要求。
SDK 就是 Xcode 编译你的 app 时用到的那一整套 iOS 库。每个 Xcode 版本都自带自己的 SDK:Xcode 26 包含 iOS 26 SDK。用新 SDK 编译,不等于放弃老 iPhone。 你的 app 支持的最低 iOS 版本是另一个独立设置,也就是部署目标(deployment target)。
和其他 ITMS 错误一样,这不是审核员拒绝的。检查是自动的,针对的是你上传的二进制文件。
Apple 现在要求哪个版本的 Xcode?
以下是 Apple 即将生效的要求页面和 App Store 提交页面的内容,查阅于 2026 年 10 月 15 日:
| 日期 | 要求 |
|---|---|
| 2026 年 4 月 28 日 | Xcode 26,iOS 26 SDK |
| 2026 年 9 月 9 日 | 最低目标 iOS 13 |
| 2027 年 4 月 | iOS 27 SDK,目标 iOS 15 |
触发 ITMS-90725 的是第一条。用 Xcode 16 和 iOS 18 SDK 做的构建已经不再被接受。第二条针对的是最低目标版本,不是 SDK。第三条预告在 2027 年 4 月,查阅时页面上还没有具体日期。Apple 已经在建议用 Xcode 27 编译和测试了。
这个要求会定期提高,而且总在春天。 Apple 这个页面保留了好几个截止日期的记录:2023 年 4 月 25 日 Xcode 14.1,2024 年 4 月 29 日 Xcode 15,2026 年 4 月 28 日 Xcode 26。每年春天之前,去重新看一遍这个页面,别只信某篇文章,包括这篇。
警告还是阻止:怎么区分?
截止日期之前,ITMS-90725 是以警告形式出现的。2024 年在 Apple 论坛上,邮件里写明交付已成功,并建议在下次上传时修复。截止日期之后,Apple 写的是 app “必须”用要求的 SDK 编译才能提交:构建不再被接受。
| 线索 | 警告 | 阻止 |
|---|---|---|
| 上传日期 | 截止日期之前 | 截止日期之后 |
| 上传被接受 | 是 | 否 |
| 你要做的 | 下次修复 | 重新构建 |
ITMS-90725 警告就是一个倒计时。 这次构建能通过,但下一次如果还这样编译,过了日期就会被拒。趁你还没有紧急更新要发,先把它修好。
在 Expo 项目中修复 ITMS-90725
用 EAS 的话,你的 app 是在 Expo 的 Mac 上编译的,我在没有 Mac 也能发布 iOS app 里讲过。Xcode 版本取决于构建镜像。如果你没在 eas.json 里指定 image,EAS 会用 auto 别名:根据你的 Expo SDK 版本选择镜像。
以下是每个 SDK 对应的镜像,依据 EAS 基础设施文档,更新于 2026 年 10 月 8 日:
| Expo SDK | 镜像的 Xcode | ITMS-90725 |
|---|---|---|
| 57 | 26.6 | 否 |
| 56 | 26.4 | 否 |
| 55 | 26.2 | 否 |
| 54 | 26.0 | 否 |
| 53 | 16.4 | 是 |
| 52 | 16.2 | 是 |
- 看看你上一次构建用的镜像。 在 expo.dev 的构建页面上,日志里的“Spin up build environment”部分会显示镜像名称和 Xcode 版本。
- 如果你在 SDK 54 或更高版本,检查有没有强制指定镜像。 只要有一行
image指向 Xcode 16,比如macos-sequoia-15.6-xcode-16.4,就足以引发这个错误。Expo 文档把它列为 SDK 54 中不想用 Xcode 26 的人可选的镜像:自 2026 年 4 月 28 日起,这个选择会导致被拒。删掉这一行:EAS 就会回到默认镜像。 - 如果你在 SDK 53 或更低版本,升级 SDK。 这是 Expo 在 2026 年 4 月 27 日的公告里的建议:至少升到 SDK 54。
- 重新构建并重新上传。 SDK 是固化在二进制文件里的:远程更新改变不了它。
老 SDK 的临时应急方案
Expo 同一篇公告还给了一个选项,适合暂时没法升级的情况:在 eas.json 的 production 配置里强制指定一个 Xcode 26 镜像。
{
"build": {
"production": {
"ios": {
"image": "macos-sequoia-15.6-xcode-26.2"
}
}
}
}
Expo 提醒:并不是所有 SDK 版本都兼容 Xcode 26,结果也取决于你用的库。把它当成缓兵之计,而不是修复。 如果编译失败,唯一的出路还是升级 SDK。
升级 SDK,一次升一个版本
Expo 升级指南建议一次只升一个版本,这样每一步都能发现哪里坏了。从 SDK 53 升到 SDK 54:
npm install expo@^54.0.0
npx expo install --fix
npx expo-doctor
如果你的 ios 文件夹是 Expo 生成的,就把它删掉:下次构建时会重新生成。然后先在你的 iPhone 上测试 app,再继续升下一个版本。
瞄准最新 SDK 之前,有一点要知道。根据 Expo 版本表,SDK 54 和 55 支持 iOS 15.1 及以上,SDK 56 和 57 只支持 iOS 16.4 及以上。所以升到 SDK 56,就会放弃还停留在 iOS 15 的 iPhone。 要解决 ITMS-90725,SDK 54 就够了。
上传前检查构建的 SDK
Xcode 会把所用的 SDK 和 Xcode 版本写进每个构建的 Info.plist。从 expo.dev 的构建页面下载 IPA,然后在你的 Mac 上运行:
unzip -q MonApp.ipa -d ipa
plutil -extract DTSDKName raw ipa/Payload/*.app/Info.plist
plutil -extract DTXcode raw ipa/Payload/*.app/Info.plist
对于要上 App Store 的构建,第一个值必须以 iphoneos26 开头。第二个值是 Xcode 版本的编码:我用 Xcode 26.2 为模拟器做的一个 Nolera 构建,得到的是 2620。如果你看到 iphoneos18,或者以 16 开头的值,这个构建就会被拒。
如果你在自己的 Mac 上编译,算数的是你本机的 Xcode,不是 EAS 的镜像。xcodebuild -version 会显示当前启用的版本。持续集成也是同样的道理:Xcode 版本取决于所选的机器。2024 年在 Apple 论坛上,就有开发者因为 GitHub Actions 机器的 macOS 太旧、装不了 Xcode 15 而收到 ITMS-90725。
正确的构建上传之后,提交之前先在 TestFlight 里测试。新构建也要重新走审核,时间见 App Store 审核需要多久。
上传构建,不再有意外
ITMS-90725 一分钟就能预防:每次生产构建前,检查镜像和 SDK。其他自动检查也需要同样的严谨,比如权限说明文字的 ITMS-90683。审核员的拒绝则需要更冷静地处理:处理步骤在 app 被 Apple 拒绝页面,最常见的原因在Apple 为什么拒绝 app。
想在上传前检查你的材料,Review Kit 汇集了我的检查清单,以及会审阅你项目的 Claude Code skills。如果上传卡住了,想要真人帮你看看,和我预约一小时:我们视频连线,在你的屏幕上一起过你的项目。如果你在准备第一次发布,做一下免费诊断:它会把步骤理顺,并发给你我的 Apple 防拒检查清单。
常见问题
ITMS-90725 会阻止我发布 app 吗?
过了 Apple 定的截止日期,会:构建不再被接受,必须重新编译一个。截止日期之前,它只是警告:这次构建能通过,但下一次如果还这样编译就会被拒。
用 iOS 26 SDK 编译,必须放弃老 iPhone 吗?
不用。编译用的 SDK 和最低 iOS 版本是两个独立设置。用 Expo 的话,这个最低版本由你的 Expo SDK 版本决定:SDK 54 和 55 是 iOS 15.1,SDK 56 和 57 是 iOS 16.4。
能用远程更新修复 ITMS-90725 吗?
不能。SDK 在编译时就写进了二进制文件。远程更新只改变 JavaScript 和资源文件。必须用 Xcode 26 重新构建并重新上传。
怎么知道 EAS 用的是哪个版本的 Xcode?
在 expo.dev 打开构建日志,看“Spin up build environment”部分。镜像名称会标明 Xcode 版本,比如 macos-tahoe-26.5-xcode-26.6。完整列表在 EAS 基础设施文档里。
2027 年 4 月的要求会带来什么变化?
根据 Apple 的提交页面,届时必须用 iOS 27 SDK 编译,并且最低目标至少是 iOS 15。EAS 方面,Expo 计划为未来的 SDK 58 提供带 Xcode 27 的镜像:编译前查看构建镜像列表。春天时重新看一遍 Apple 的页面,确认具体日期。

