症狀: Expo SDK 58 升級後 iOS EAS Build 失敗。
最快處理:先下載完整 Xcode 建置紀錄,定位最早出現的有效錯誤,再核對遷移變更、上傳檔案、環境變數與簽署階段;不要只因升級時間接近,就判定 SDK 是根因。
適合剛升級 Expo SDK 58、EAS iOS 建置無法完成的獨立開發者,可依紀錄逐層定位。
使用 config plugin、自訂原生目錄或原生模組的小團隊,可核對遷移與雲端設定是否一致。
沒有本機 Mac、主要依靠雲端建置發布 iOS App 的開發者,也可據此判斷何時需要可互動的 Mac 環境重現。
最後更新於 2026 年 11 月 6 日;本文依 Expo SDK 58 變更紀錄、EAS 建置與排障文件,以及 Apple 的 Xcode 系統需求資料核對。單一專案的錯誤仍須以完整紀錄與可重現結果確認。
Expo SDK 58 iOS EAS Build 失敗時,應先查看哪份紀錄?
先查看該次建置的完整 iOS/Xcode 紀錄,不要只依賴建置詳情頁上的摘要訊息。摘要常能指出失敗階段,卻未必包含觸發失敗的前置錯誤;最後一行「建置失敗」通常也不足以判斷是依賴安裝、原生編譯、封存或簽署問題。Expo 的建置排障文件建議檢視完整 iOS 建置紀錄,並從實際失敗階段開始排查。
先把紀錄中最早出現的具體錯誤,與後續連鎖訊息分開。像「找不到模組」、「無法解析檔案」或特定編譯器錯誤,通常比末尾的泛化失敗摘要更有定位價值。回看升級前後的提交差異,再依錯誤所屬階段選下一項檢查:
| 紀錄中最早的有效線索 | 優先檢查 | 暫時不要做的事 |
|---|---|---|
| JavaScript 套件安裝或解析失敗 | lockfile、套件版本、安裝命令及雲端收到的檔案 | 先不要重建簽署憑證 |
| 原生套件或 Xcode 編譯錯誤 | 原生依賴版本、Pod 安裝結果、SDK 遷移與原生目錄 | 不要只根據最後一行改 EAS 設定 |
| 封存或簽署階段錯誤 | 憑證、Apple 團隊、Bundle Identifier 與簽署設定 | 不要把簽署問題當成編譯問題處理 |
| 建置完成後才崩潰或顯示異常 | Release 執行紀錄、設備日誌及相關遷移路徑 | 不要把執行期故障直接算作建置失敗 |
原生依賴或 config plugin 報錯,如何縮小範圍?
先確認專案如何產生 iOS 原生目錄,再比對 Expo SDK 58 變更紀錄中與專案實際用到功能相關的遷移項目。Expo 的SDK 58 官方變更紀錄列出該版本的破壞性變更;這不代表每個專案都會遇到相同故障,必須先核對專案是否走到相應的程式碼路徑。
| 專案狀態 | 應核對的內容 | 判斷方向 |
|---|---|---|
| 使用 Continuous Native Generation(CNG) | app config、config plugin、套件版本及生成後的 iOS 檔案 | 確認 plugin 是否仍能產生專案預期的原生設定 |
手動維護 ios 目錄 |
原生檔案是否與目前依賴及遷移要求一致 | 不要假設重新生成原生目錄一定適合現有專案 |
| 自行修改 AppDelegate 或使用原生模組 | 修改內容、模組相容性與編譯錯誤所指檔案 | 從第一個相關原生錯誤回查,不要只升級所有套件 |
可先用版本控制檢視升級引入了哪些變更:
git status --short
git diff -- package.json app.json eas.json
接著比較升級前後的依賴鎖定檔與原生目錄。若錯誤指向 config plugin,先確認設定中載入了哪個 plugin、其輸入選項是否仍有效,再檢查生成結果;若錯誤指向手動維護的原生檔案,則沿著編譯錯誤找到對應修改。這能避免把 SDK 遷移說明中不相關的項目,誤認為本次故障原因。
SDK 58 變更紀錄也說明 iOS 27 SDK 的 scene-based 生命週期要求及相關遷移邊界。只有當專案使用到相關生命週期或自訂場景處理時,才應沿此方向追查;不要看到版本說明就直接改寫整個 AppDelegate。
雲端缺檔或依賴無法解析時,先檢查建置輸入
雲端建置使用的是上傳到建置服務的專案歸檔,不一定等同開發者目前工作目錄的完整內容。未提交的本機檔案、忽略規則或 .easignore 都可能造成兩邊輸入不同。依 Expo 的EAS 上傳歸檔規則,檢查實際會被包含的專案檔案與忽略設定。
| 本機狀態 | 可能造成的差異 | 核對方式 |
|---|---|---|
| 必要檔案只存在於工作目錄,尚未提交 | 雲端歸檔缺少本機可讀取的檔案 | 檢查版本控制狀態與實際提交內容 |
.gitignore 或 .easignore 排除了必要檔案 |
雲端無法取得設定、資產或建置所需檔案 | 對照忽略規則與 EAS 歸檔內容 |
| 套件安裝時使用的 lockfile 不一致 | 本機與雲端解析出的依賴樹不同 | 確認 lockfile 已提交,並核對套件管理器 |
| 環境變數只設在本機 | 雲端建置缺少必要設定或使用不同值 | 對照 EAS 環境變數與建置設定 |
追查時把 JavaScript 打包、原生依賴安裝及 Xcode 編譯分開。若先在依賴安裝階段失敗,就先確認套件來源、lockfile 和上傳內容;只有紀錄已進入原生編譯後,才把重點移到 Xcode 與原生模組。環境變數則按Expo EAS 環境變數說明核對其設定位置與使用方式,不要在公開日誌或版本控制檔案中暴露機密值。
本機成功、EAS Build 失敗時,差異要怎樣核對?
本機建置成功只能證明該本機狀態可建置,不能單獨證明 EAS 或 SDK 有故障。先對齊提交、套件管理器、Node 版本、Xcode、環境變數與建置歸檔內容,再比較最早失敗階段。Apple 的Xcode 系統需求可用來核對 Xcode 版本與系統相容條件;不要只因兩邊都顯示「使用 Xcode」,就當作工具鏈完全相同。
| 比較項目 | 本機建置 | EAS 雲端建置 |
|---|---|---|
| 原始碼 | 工作目錄可能含未提交變更 | 以雲端實際收到的歸檔為準 |
| 依賴 | 可能沿用本機快取 | 依雲端安裝流程與 lockfile 解析 |
| 工具鏈 | 本機已安裝的 Node、Xcode 等 | 依 EAS 建置設定與建置環境核對 |
| 環境變數 | Shell、IDE 或本機設定可能提供變數 | 檢查所選 EAS 環境及變數可見性 |
| 診斷依據 | 本機輸出與設備紀錄 | 完整建置日誌及建置詳情 |
依結果選擇下一個診斷環境
- 若本機與 EAS 使用相同提交、依賴及必要設定,且錯誤指向 Xcode 或原生模組,就使用相近工具版本的 Mac 重現原生建置,再對照兩邊最早的有效錯誤。
- 若本機與 EAS 的提交或歸檔內容不同,先修正輸入差異,再重新執行 EAS Build;此時轉換建置路徑只會增加變因。
- 若本機 Release 建置通過、EAS 在安裝依賴或讀取環境變數時失敗,優先檢查雲端安裝、上傳檔案及變數設定,而不是反覆清除 Xcode 設定。
- 若錯誤涉及只有 macOS/Xcode 才能執行的原生步驟,但手邊沒有 Mac,可依Expo 本機建置說明確認本機建置方式與限制,再決定是否安排可互動的 Mac 環境重現。
操作前先固定要比較的提交與建置設定,避免一次改動多項因素。建置紀錄中應保留失敗階段、錯誤片段及對應提交識別;修正後使用相同專案狀態重跑,才看得出變更是否真正解決問題。
簽署失敗與建置後異常要分開診斷
若錯誤發生於簽署或封存階段,先核對 Apple 團隊、Bundle Identifier、iOS 建置憑證與佈建設定是否彼此匹配。不要為了解決原生編譯錯誤而任意撤銷憑證,也不要在簽署失敗時重寫 config plugin;先依完整紀錄確認失敗發生在編譯、封存還是簽署,再只調整對應設定。
若建置已完成,但 App 啟動後崩潰、畫面異常或只在特定設備出錯,這是執行期問題,不等於 EAS Build 失敗。依 Expo 排障建議檢查 Release 建置與設備日誌,並確認問題是否與 SDK 遷移中實際使用的生命週期或原生功能相關。修正後再次檢查建置產物、簽署狀態及後續上傳結果,避免只以「建置工作完成」作為發布前的唯一判準。
結論是先用最早的有效錯誤劃定故障階段,再核對輸入、工具鏈與設定;只有需要 macOS、Xcode 或原生專案工具才能驗證時,才增加 Mac 重現環節。若問題僅來自依賴或專案設定,先修正後在既有 EAS 流程復測即可。
若問題確實卡在本機無法執行的 Xcode 原生建置,而團隊又不打算為短期排障添購實機,可把遠端 Mac 作為臨時診斷環境;若長期需要固定重負載、實體裝置或專用介面,自購 Mac 可能更合適。使用前可先查看遠端 Mac 環境與方案比較,並了解香港 Mac 使用方案是否符合團隊的連線與操作需求。OnceMac 只適合作為有明確 macOS 工具鏈需求時的選項,不會替代對專案設定或雲端歸檔問題的修正。
用 OnceMac 獨享雲端 Mac,重現 iOS 建置問題
在獨享實體 Mac 上重跑原生建置,對照本機與雲端環境,協助縮小問題範圍。
