症狀:手動上傳成功,但無人值守 Lane 在遠端 Mac 上卡在簽名、認證或 Processing。

最快解法:先固定 Apple silicon 遠端 Mac、Xcode 27、Ruby、Bundler 與 fastlane 版本,再拆成測試、Archive、上傳三條 Lane;最後才接入憑證,並用斷線、重啟與失敗恢復驗收整條流程。

這篇適合在 Windows 或 Linux 上編碼、需要遠端完成 iOS 建置與發布的獨立開發者;也適合反覆上傳 TestFlight,或準備把臨時環境改成常駐 iOS 打包機的小型團隊。

動手前:先把「上傳成功」和「可以發布」分開

fastlane 可以編排測試、Archive、簽名、Export 與上傳,但它不能取代 macOS、Xcode 或 Apple Developer 帳號。Apple 對 Xcode 的 macOS 與硬體要求會隨版本更新,Xcode 27 目前應以 Apple Developer 的系統要求頁面核對;截至 2026 年 9 月 13 日,Apple 已提供 Xcode 27 RC,正式版日期與最終系統要求仍須在發布時再次確認。Apple Xcode 系統要求

你要先保留一次能成功完成的手動 Archive 與 TestFlight 上傳,作為後續自動化的對照基線。這個基線至少要記錄:

  • 使用的 Xcode 版本、macOS 版本與開發者目錄。
  • Workspace、Scheme、Bundle ID、Team ID,以及版本號與 Build 號的來源。
  • 產生的 xcarchive 或 IPA、上傳日誌,以及 App Store Connect 中的建置狀態。
  • 哪個步驟代表「檔案已傳送」,哪個步驟代表「Apple 已完成處理」。
不要把以下動作寫成同一件事:建立 Archive、Export IPA、上傳建置、等待後台處理、分配 TestFlight 測試者,以及建立版本後提交 App Review。Apple 的建置狀態頁面說明了上傳後仍可能處於處理中、失敗或可用等不同狀態,因此「命令結束」不等於「建置可測試」。[Apple 建置狀態說明](https://developer.apple.com/help/app-store-connect/reference/app-uploads/app-build-statuses)

第一小時:固定 Xcode 27 與 fastlane 的可重建環境

先在遠端 Mac 建立專用工作目錄,再確認目前使用的是預期的 Xcode:

xcode-select -p
xcodebuild -version
ruby --version
bundle --version
locale

不要把 RC 當成正式版,也不要因為命令列可以執行,就推定 Xcode 27 已符合你的專案、SDK 與上傳要求。當正式版發布後,重新核對 Apple 的系統要求與 App Store Connect 的上傳支援範圍,再決定是否切換;在此之前,生產發布環境應保留原有可重現的版本。

fastlane 不應依賴系統 Ruby 或沒有版本限制的全域安裝。請在專案根目錄建立 Gemfile,並把鎖定檔納入版本控制:

source "https://rubygems.org"

gem "fastlane"

接著執行:

bundle install
bundle exec fastlane --version

fastlane 官方安裝說明同樣建議透過 Bundler 管理依賴,避免不同主機或不同時間安裝到不一致的版本。fastlane iOS 安裝與設定

同一階段也要固定以下入口,否則日後換主機時很難判斷失敗原因:

  • DEVELOPER_DIRxcode-select 指向的 Xcode。
  • Ruby 與 Bundler 的執行方式。
  • UTF-8 Locale,避免版本號、匯出設定或日誌出現編碼差異。
  • Podfile、Swift Package、Node 或 Flutter 等專案依賴的安裝指令。
  • 建置輸出、日誌與暫存檔的明確路徑。

第二步:先拆 Lane,再接上完整建置

不要第一天就寫一條從測試、簽名、Archive 到上傳的超長 Lane。拆分後,每次失敗都能知道是測試、建置,還是發布邊界出了問題。

下面的 Fastfile 只使用脫敏佔位符;你必須把值放在專案設定、環境變數或安全的 CI 注入流程中,不能直接照抄:

default_platform(:ios)

platform :ios do
  lane :verify do
    run_tests(
      workspace: "APP_WORKSPACE_PLACEHOLDER.xcworkspace",
      scheme: "APP_SCHEME_PLACEHOLDER"
    )
  end

  lane :build do
    build_ios_app(
      workspace: "APP_WORKSPACE_PLACEHOLDER.xcworkspace",
      scheme: "APP_SCHEME_PLACEHOLDER",
      output_directory: "BUILD_OUTPUT_PLACEHOLDER"
    )
  end

  lane :upload_testflight do
    pilot(
      ipa: "IPA_PATH_PLACEHOLDER",
      skip_waiting_for_build_processing: true
    )
  end
end
verify 的成功條件是測試報告可取得;build 的成功條件是指定路徑產生可驗證的 Archive 或 IPA;upload_testflight 的成功條件則是 App Store Connect 接受檔案並留下可追蹤的上傳結果。每條 Lane 都要定義:
  • 成功產物:測試報告、xcarchive、IPA 或上傳識別資料。
  • 日誌位置:包括命令輸出與 fastlane 產生的摘要。
  • 停止條件:簽名失敗、測試失敗、輸出檔案不存在時,不得繼續上傳。
  • 後續驗證:命令返回成功後,還要到 App Store Connect 核對建置狀態。
build_ios_app 會負責建置與匯出流程,但實際簽名方法、Export 設定與專案的 Scheme 仍需由你明確配置。[fastlane build_ios_app 說明](https://docs.fastlane.tools/actions/build_ios_app/)

第三步:沒有本地 Mac,也可以用 fastlane 打包 iOS App 嗎?

可以,但前提是遠端主機真的能執行 macOS 與 Xcode,而且你能以 SSH、VNC 或網頁控制台取得完整的工作環境。Windows 或 Linux 只負責提交程式碼、觸發命令與查看日誌;測試、Archive、Export 和簽名仍在遠端 Mac 完成。

遠端環境的限制不只在連線:

  1. 權限限制:沒有安裝 Xcode、寫入 Keychain 或讀取簽名資產的權限,Lane 會在本機可用、遠端失敗。
  2. 狀態依賴:SSH 連線中斷不代表建置停止,也不代表上傳已完成;若沒有持久化工作階段與日誌,你無法判斷應重跑哪一步。
  3. 憑據風險:Apple ID、API Key、憑證私鑰與 Provisioning Profile 是不同資產,不能用一個 Token 取代全部權限。
  4. 工具鏈漂移:全域 fastlane、未鎖定 Ruby 或自動更新 Xcode,會讓昨天成功的 Lane 今天產出不同結果。
  5. 後台延遲:IPA 被接受後仍要等待 App Store Connect 處理,測試者分配與送審又是另外的流程。
如果你只是偶爾打包,臨時遠端 Mac 足以先建立基線;若每週或每月都要發布,則應把固定工具鏈、持久化日誌與重啟後可恢復性列為主機選擇條件。

第四步:簽名憑據要分成兩條受控鏈路

程式碼簽名資產與 App Store Connect 上傳憑據不是同一組權限。API Key 可用於 App Store Connect 的特定 API 操作,但不能替代證書私鑰與 Provisioning Profile。fastlane 對 App Store Connect API 的認證方式、金鑰欄位與使用限制,應以其官方文件及 Apple 帳號角色設定為準。fastlane App Store Connect API 說明

你可以按以下邏輯選擇:

<
路徑適合情況遠端 Mac 上的風險建議評分
匯入既有簽名資產你已經有可用證書、私鑰與 Profile,想先重現手動發布私鑰匯入、Keychain 解鎖與 Profile 對應容易漏記★★★★☆
Xcode 自動簽名專案簡單,且允許由開發者帳號管理資產主機狀態或帳號權限變更時,非互動式流程可能停住★★★☆☆
受控同步簽名資產多個環境需要一致的簽名資產與輪換流程憑據保存、存取範圍與撤銷流程需要額外維護★★★★☆
首次執行時,先使用已驗證的簽名資產完成 Archive,再把非互動式注入納入 Lane。Apple ID 適合需要登入互動或處理帳號相關操作的情境;App Store Connect API Key 則應限制在它實際需要的 API 操作。不要把私鑰、Token、密碼、Bundle ID、Team ID 或主機地址硬編碼在 Fastfile 和公開儲存庫。

第五步:fastlane 如何自動把建置送到 TestFlight?

先讓 pilot 只負責上傳已存在的 IPA,等端到端驗收成功後,再考慮加入測試者、元資料或送審動作。這樣能把「建置檔案有問題」和「App Store Connect 認證或處理有問題」分開。

一個安全的首次流程如下:

  1. 執行 bundle exec fastlane verify,確認測試報告完整。
  2. 執行 bundle exec fastlane build,確認 Archive 或 IPA 位於預期路徑。
  3. 檢查 Bundle ID、版本號、Build 號與簽名資訊,不要只看命令返回碼。
  4. 執行 bundle exec fastlane upload_testflight,記錄上傳日誌。
  5. 到 App Store Connect 核對建置是否進入處理、可測試或失敗狀態。
  6. 確認建置已與正確 App 記錄關聯,再分配測試者。
  7. 只有在測試流程穩定後,才評估建立新版本與提交 App Review。
Apple 的上傳說明、建立 App 記錄、選擇建置與建立新版本是分開的操作;你應依照實際狀態逐項確認,而不是把 pilot 的命令成功當成發布完成。[Apple 上傳建置說明](https://developer.apple.com/help/app-store-connect/manage-builds/upload-builds) [Apple 建立 App 記錄](https://developer.apple.com/help/app-store-connect/create-an-app-record/add-a-new-app) [Apple 選擇要提交的建置](https://developer.apple.com/help/app-store-connect/manage-builds/choose-a-build-to-submit)

第六步:用清單驗收遠端 Mac 的斷線與重啟恢復

在你把這台主機當成常駐 iOS 打包機前,逐項完成以下驗收。這些是可操作的停止條件,不是單純的設定建議:

  • [ ] 測試、Build、Archive、Export、Upload 已拆成可單獨重跑的 Lane。
  • [ ] Gemfile 與鎖定檔已提交,Ruby、Bundler、fastlane 與 Xcode 版本來源已記錄。
  • [ ] Fastfile 沒有私鑰、Token、密碼、真實主機地址或未脫敏帳號資料。
  • [ ] IPA 或 Archive、命令日誌、App Store Connect 狀態可分別保存。
  • [ ] 只中斷 SSH 連線,重新連線後仍能找到工作狀態與日誌。
  • [ ] 登出使用者後,重新登入不會遺失 Keychain、環境變數或工作目錄。
  • [ ] 重啟遠端 Mac 後,能重新確認 Xcode 路徑、憑據可用性與待處理產物。
  • [ ] 撤銷或輪換憑據後,Lane 會明確失敗並停止,不會誤上傳舊產物。
  • [ ] Xcode 27 正式版切換已在獨立驗證 Lane 測試,沒有直接污染生產發布環境。
遠端 Mac 重啟後,fastlane 任務不應依靠「猜測是否已經跑完」。你要以產物、日誌和 App Store Connect 狀態三者交叉確認:沒有 IPA 或 Archive,就不能直接跳到上傳;已有上傳日誌但狀態仍在處理,就不能重複提交;狀態失敗則應保留原始錯誤,再從對應 Lane 重跑。

若你需要把 SSH 長任務、重啟策略與日誌保存獨立整理,可先參考 遠端 Mac 方案入口,再按你的發版頻率評估短期驗證或常駐環境。對於需要固定工具鏈的團隊,也可查看 M4 遠端 Mac 租用方案;選擇前仍應先以脫敏專案完成上述驗收。

第一週:把一次成功改造成可維護的發布流程

第一週不要急著增加更多 fastlane Action,而要觀察每次發布的責任邊界。你應分別演練 SSH 中斷、重新登入、主機重啟與憑據失效,並記錄哪些工作能恢復、哪些工作必須從 Archive 重新開始。

同時建立兩條獨立驗證路徑:

  • 工具鏈升級 Lane:只驗證 Xcode、Ruby、Bundler、fastlane 與專案依賴。
  • 憑據輪換 Lane:只驗證新證書、Profile 或 API Key 的注入與撤銷後行為。
當 Xcode 27 正式版發布、Apple 調整上傳門檻,或 fastlane 改變 Ruby 與認證要求時,先在驗證環境核對官方文件,再決定是否切換生產 Lane。Apple 的新版本建立與提交流程也應在正式送審前重新檢查。[Apple 建立新版本說明](https://developer.apple.com/help/app-store-connect/update-your-app/create-a-new-version)

本地 Mac 的優點是實體連線與互動除錯直接;但對需要固定在線的發布流程來說,購買硬體會帶來一次性設備成本、維護、更新與閒置問題。雲端建置服務則可能限制 macOS 版本、互動權限或自訂憑據保存方式。若你只是長期執行高負載、需要實體 USB 裝置,租用遠端 Mac 未必適合;若你的需求是保留完整 macOS 權限、固定 Xcode 工具鏈,並在發版期間提供可重新連線的打包環境,MACGPU 的遠端 Mac 會比臨時拼湊 Windows、Linux 或不穩定的共用環境更容易納入這套驗收流程。你可以先用短期租用完成驗證,確認 Lane、憑據與恢復策略都成立後,再決定是否保留常駐環境。