# ITMS-90725 SDK version issue：用 Expo 修正

> ITMS-90725 代表 App 用太舊的 iOS SDK 編譯。Apple 自 2026 年 4 月 28 日起要求 Xcode 26，請升到 Expo SDK 54 以上並重新 build。

原始頁面：[ITMS-90725 SDK version issue：用 Expo 修正](https://devoria.fr/zh-hant/blog/itms-90725-sdk-version-issue-expo)
作者：[Mehdi Azizi](https://devoria.fr/zh-hant/mehdi-azizi)
發布日期：2026-11-04
內容最後修訂：2026-11-04


ITMS-90725 是 Apple 對你的 build 做的自動檢查：它表示這個 App 是用比最低要求還舊的 iOS SDK 編譯的。截至 2026 年 10 月 15 日，Apple 表示自 2026 年 4 月 28 日起，上傳到 App Store Connect 的 App 必須用 Xcode 26 以上版本和 iOS 26 SDK 編譯。**用 Expo 的話，關鍵全在 EAS 的 build 映像檔：從 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 的[即將實施的要求](https://developer.apple.com/news/upcoming-requirements/)頁面和 [App Store 提交](https://developer.apple.com/app-store/submitting/)頁面的內容，於 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 做的 build 已經不會被接受。第二條針對的是最低支援版本，不是 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 論壇上的案例中，email 說明這次上傳成功，並建議在下一次上傳時修正。過了期限之後，Apple 寫的是 App「必須」用指定的 SDK 編譯才能上傳：build 就不會被接受了。

| 線索       | 警告           | 封鎖       |
| ---------- | -------------- | ---------- |
| 上傳日期   | 期限之前       | 期限之後   |
| 上傳被接受 | 是             | 否         |
| 你該做的事 | 下次上傳時修正 | 重新 build |

**ITMS-90725 警告就是倒數計時。** 今天這個 build 能過，但過了期限後，用同樣方式編譯的下一個 build 就會被拒。趁你還沒被緊急更新追著跑的時候把它修好。

## 在 Expo 專案中修正 ITMS-90725

用 EAS 的話，你的 App 是在 Expo 的 Mac 上編譯的，我在[沒有 Mac 也能上架 iOS App](https://devoria.fr/zh-hant/blog/publish-ios-app-without-mac-expo-eas) 裡有說明。Xcode 版本取決於 build 映像檔。如果你沒有在 eas.json 裡指定 `image`，EAS 會使用 `auto` 別名：它會依照你的 Expo SDK 版本選擇映像檔。

以下是根據 [EAS 基礎架構文件](https://docs.expo.dev/build-reference/infrastructure/)（2026 年 10 月 8 日更新）整理的各 SDK 對應映像檔：

| Expo SDK | 映像檔的 Xcode | ITMS-90725 |
| -------- | -------------- | ---------- |
| 57       | 26.6           | 否         |
| 56       | 26.4           | 否         |
| 55       | 26.2           | 否         |
| 54       | 26.0           | 否         |
| 53       | 16.4           | 是         |
| 52       | 16.2           | 是         |

1. **查看你上一次 build 用的映像檔。** 在 expo.dev 的 build 頁面上，日誌中的「Spin up build environment」區段會顯示映像檔名稱和它的 Xcode 版本。
2. **如果你在 SDK 54 以上，找找看有沒有強制指定的映像檔。** 只要有一行 `image` 指向 Xcode 16，例如 `macos-sequoia-15.6-xcode-16.4`，就足以造成這個錯誤。Expo 文件把它列為給不想用 Xcode 26 的人使用的 SDK 54 映像檔：自 2026 年 4 月 28 日起，這個選擇會導致被拒。刪掉這一行，EAS 就會回到預設映像檔。
3. **如果你在 SDK 53 以下，就升級 SDK。** 這是 Expo 在 [2026 年 4 月 27 日公告](https://expo.dev/blog/app-store-connect-minimum-sdk-26)中的建議：至少升到 SDK 54。
4. **重新 build 並再次上傳。** SDK 是固定在二進位檔裡的：遠端更新改變不了什麼。

### 舊 SDK 的應急解法

Expo 同一篇公告也提供了一個選項，給暫時沒辦法升級的人：在 eas.json 的 production profile 裡強制指定 Xcode 26 映像檔。

```json
{
  "build": {
    "production": {
      "ios": {
        "image": "macos-sequoia-15.6-xcode-26.2"
      }
    }
  }
}
```

Expo 有提醒：不是每個 SDK 版本都相容於 Xcode 26，結果也取決於你用的函式庫。**把它當成緩刑，而不是修正。** 如果 build 在編譯階段失敗，唯一的路還是升級 SDK。

### 升級 SDK，一次一個版本

[Expo 的升級指南](https://docs.expo.dev/workflow/upgrading-expo-sdk-walkthrough/)建議一次只升一個版本，這樣每一步都能找出哪裡壞掉。從 SDK 53 升到 SDK 54：

```bash
npm install expo@^54.0.0
npx expo install --fix
npx expo-doctor
```

如果你的 `ios` 資料夾是 Expo 產生的，就把它刪掉：下次 build 時會重新產生。然後先在你的 iPhone 上測試 App，再進行下一個版本的升級。

要衝最新 SDK 之前，有一點要知道。根據 [Expo 的版本表](https://docs.expo.dev/versions/latest/)，SDK 54 和 55 支援 iOS 15.1 以上，SDK 56 和 57 只支援 iOS 16.4 以上。**所以升到 SDK 56，就會排除還停在 iOS 15 的 iPhone。** 要解決 ITMS-90725，SDK 54 就夠了。

## 上傳前檢查 build 的 SDK

Xcode 會把使用的 SDK 和 Xcode 版本寫進每個 build 的 Info.plist。從 expo.dev 的 build 頁面下載 IPA，然後在你的 Mac 上執行：

```bash
unzip -q MyApp.ipa -d ipa
plutil -extract DTSDKName raw ipa/Payload/*.app/Info.plist
plutil -extract DTXcode raw ipa/Payload/*.app/Info.plist
```

如果是要上 App Store 的 build，第一個值必須以 `iphoneos26` 開頭。第二個值是 Xcode 版本的編碼：我用 Xcode 26.2 為模擬器做的 Nolera build，得到的是 `2620`。如果你看到 `iphoneos18`，或是以 `16` 開頭的值，這個 build 就會被拒。

如果你是在自己的 Mac 上編譯，算數的是你的 Xcode，不是 EAS 的映像檔。`xcodebuild -version` 會顯示目前使用的版本。CI 也是同樣道理：Xcode 版本取決於你選的機器。2024 年在 Apple 論壇上，有開發者收到 ITMS-90725，就是因為他們的 GitHub Actions 機器跑的 macOS 太舊，裝不了 Xcode 15。

正確的 build 上傳之後，提交審查前先在 [TestFlight](https://devoria.fr/zh-hant/blog/testflight-test-iphone-app-before-review) 裡測試。新的 build 也要重新經過審查，所需時間請看 [App Store 審核時間](https://devoria.fr/zh-hant/blog/app-store-review-time)。

## 上傳 build 不再有意外

ITMS-90725 一分鐘就能預防：每次 production build 前檢查映像檔和 SDK。其他自動檢查也需要同樣的嚴謹，例如權限說明文字的 [ITMS-90683](https://devoria.fr/zh-hant/blog/itms-90683-missing-purpose-string-expo)。審查員退件則需要多一點思考：處理方式在 [App 被 Apple 拒絕](https://devoria.fr/zh-hant/expertise/app-rejected-by-apple)頁面，最常見的原因整理在 [Apple 為什麼拒絕你的 App](https://devoria.fr/zh-hant/blog/apple-app-rejection-reasons-real-cases)。

想在上傳前檢查你的資料，[Review Kit](https://devoria.fr/zh-hant/kits/app-review) 收錄了我的檢查清單，以及會幫你審視專案的 Claude Code skills。如果上傳卡住、你想找人看看，[跟我預約一小時](https://devoria.fr/zh-hant/coaching)：我們透過視訊、在你的螢幕上一起看你的專案。如果你正在準備第一次上架，[做免費診斷](https://devoria.fr/zh-hant/diagnostic)：它會幫你把步驟排好順序，並寄給你我的防 Apple 退件檢查清單。

## 常見問題

### ITMS-90725 會讓我的 App 無法上架嗎？

過了 Apple 訂的期限，會：build 不再被接受，你必須重新編譯一個。期限之前則是警告：這個 build 能過，但下一個如果用同樣方式編譯就會被拒。

### 用 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 重新 build 再上傳。

### 怎麼知道 EAS 用的是哪個 Xcode 版本？

在 expo.dev 打開你的 build 日誌，看「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 的映像檔：編譯前先確認 build 映像檔清單。春天時重看 Apple 的頁面，才能知道確切日期。


## 你的專案

[Review Kit](https://devoria.fr/zh-hant/kits/app-review)：我的 App Store 審查檢查清單、我被 Apple 退件後的修正、Google Play 檢查清單，以及三個 Claude Code skill。$1,749。

[iOS & Android Kit](https://devoria.fr/zh-hant/kits/ios)：用 Claude Code 打造你的 iPhone 和 Android App：我自己 App 的起始程式碼、上架商店的完整流程，以及所有套件。$3,599。

[診斷：你離自己的 iPhone App 還差什麼](https://devoria.fr/zh-hant/diagnostic)：7 個問題，60 秒：找出真正卡住你發布 iPhone App 的原因，拿到你的 4 步驟路線，以及最適合你的套件。
