React Native 0.86 iOS 雲端構建:2026 教學

React Native 0.86 iOS 雲端構建:2026 教學

截至 2026 年 6 月 11 日,React Native 0.86 已有官方穩定版發布;但這不代表 Windows 或 Linux 開發者要把所有工作搬到遠端 Mac。更有效的方案是:本地保留 JavaScript/TypeScript 編碼,將 iOS 依賴安裝、Xcode 原生調試、Archive、簽名與 App Store Connect 上傳集中到遠端 Mac。React Native 官方亦明確指出,使用原生 iOS 程式碼構建需要 Mac。(React Native 0.86 官方發布說明React Native 環境配置文件)

這篇適合三類讀者:使用 Windows 或 Linux 編寫 React Native App、但沒有本地 Mac 的獨立開發者;需要維護原生模組、CocoaPods 或 Xcode 工程的項目負責人;以及希望把偶爾手動打包改成可恢復 iOS 構建流程的小型團隊。

最後更新於 2026 年 8 月 15 日。 React Native 版本資訊、環境要求、Xcode 發布流程與 App Store Connect 上傳規則,已核實自 React Native 官方文件及 Apple Developer 文件。正式部署前,仍應在乾淨測試專案重跑命令。

本地編碼與遠端 Mac 原生構建,邊界要先劃清

React Native 的 JavaScript 或 TypeScript 編碼、介面調整、狀態管理和一般單元測試,可以繼續在 Windows 或 Linux 完成。真正需要 macOS 的,是 iOS 原生工具鏈。

以下工作應放到遠端 Mac:

  • 安裝及執行 Xcode、iOS Simulator 和 Command Line Tools。
  • 執行 CocoaPods,處理 Podfile 與原生依賴。
  • 編譯含自訂原生模組的 iOS Target。
  • 處理 Bundle ID、Signing、Entitlements 和 Provisioning Profile。
  • 建立 Release Archive,驗證後上傳 App Store Connect。

如果專案只使用高度封裝的 Framework,遠端 Mac 的介入可能較少。但只要有自訂 Native Module、修改 .xcodeproj.xcworkspace、複雜 Pod 配置、原生推播或付款能力,就不應只依賴抽象化流程。完整 macOS 控制權能讓問題停留在可檢查的 Xcode 工程層,而不是只看到一段模糊的雲端錯誤訊息。

部署前先確認:

  1. Git 儲存庫讀取權限。
  2. Apple Developer 團隊權限。
  3. Bundle ID 與 App Store Connect App Record。
  4. package.json、JavaScript 鎖檔及 Podfile.lock
  5. 發布目標是 Debug、TestFlight,還是 App Store。

第一小時:先固定工具鏈,再安裝 React Native 依賴

React Native 官方環境文件目前列出 Node 22.11.0 或更新版本,並要求安裝 Xcode、Command Line Tools、CocoaPods 等 iOS 工具。這些版本不能直接從其他專案複製;應以 React Native 0.86 專案檔案、官方文件及現有 CI 設定為準。(React Native iOS 環境配置)

先在遠端 Mac 記錄工具版本:

xcodebuild -version
xcode-select -p
node --version
ruby --version
pod --version
git --version

如果 xcode-select 指向錯誤目錄,可明確指定活動開發者目錄:

sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
xcodebuild -runFirstLaunch

接著確認 Git 身份及專案路徑:

git config --global user.name "<GIT_USER>"
git config --global user.email "<GIT_EMAIL>"

mkdir -p "$HOME/workspace"
cd "$HOME/workspace"
git clone <REPOSITORY_URL> <PROJECT_DIR>
cd <PROJECT_DIR>

不要只在互動式 Terminal 中測試成功。Xcode 的 Script Phase、SSH 非互動工作階段與 CI 執行環境,未必會載入相同的 Shell 設定。若專案使用 .xcode.env,應檢查其中的 NODE_BINARY 是否指向遠端 Mac 實際可用的 Node 路徑。React Native 官方建議以這類環境檔案降低 Xcode 對本機 Node 安裝方式的依賴。

可把基線寫入檔案:

{
  xcodebuild -version
  xcode-select -p
  node --version
  ruby --version
  pod --version
} | tee build-toolchain.txt

這份檔案不是裝飾。當遠端主機重建、租期更換或團隊成員接手時,它能先回答「工具版本是否變了」,避免把環境差異誤判成程式碼回歸。

第二步:只同步原始碼與鎖檔,重新恢復 iOS 依賴

遠端同步最常見的錯誤,是把本地生成目錄整個壓縮上傳。node_modulesPodsDerivedData 和 Xcode 使用者資料都可能包含平台路徑、暫存狀態或不完整的二進位檔案。

建議的同步內容包括:

類別 應否同步 原因
JavaScript/TypeScript 原始碼 構建所需的主要輸入
package.json 與鎖檔 固定 JavaScript 依賴解析結果
ios/PodfilePodfile.lock 固定 CocoaPods 依賴狀態
node_modules 在遠端 Mac 按鎖檔重新安裝
PodsDerivedData 含本機生成資料與平台暫存狀態
私鑰、密碼、API Key 不應進入 Git 或一般同步目錄

依照專案實際使用的鎖檔執行恢復。例如:

# 依專案實際情況選擇一種
npm ci
# 或
yarn install --frozen-lockfile
# 或
pnpm install --frozen-lockfile

iOS 依賴則在 ios 目錄處理:

cd ios
bundle exec pod install
cd ..

如果專案沒有 Bundler,才按團隊既有方式執行:

cd ios
pod install
cd ..

pod install 成功只代表 CocoaPods 完成解析與生成工作區,不代表 Archive 一定成功。此時應檢查:

grep -R "<LOCAL_ABSOLUTE_PATH>" ios package.json .xcode.env 2>/dev/null
git status --short
find ios -maxdepth 2 \( -name "*.xcworkspace" -o -name "Podfile.lock" \)

Podfile、建置腳本或環境變數仍引用本地絕對路徑,應先改成相對路徑、環境變數或遠端主機可重建的路徑。

Debug 鏈路與 Release 鏈路,必須分開驗證

首次構建不應直接從上架開始。先用 Debug 鏈路確認 Metro、原生模組、資源檔案、程式碼生成與模擬器目標能否協同工作。

先啟動 Metro:

npx react-native start

再開另一個 SSH 或圖形終端:

npx react-native run-ios --simulator "<SIMULATOR_NAME>"

遠端圖形桌面適合處理 Xcode Scheme、Signing、模擬器和錯誤定位。SSH 則適合執行可重複的安裝、測試、Archive 與日誌保存。兩者不要被當成同一種操作體驗:模擬器畫面需要穩定的圖形連線,批次構建則應保留在可重跑的命令列腳本。

建議把錯誤分成四層:

  1. 依賴恢復:套件版本、Pod 解析、鎖檔和 Ruby 環境。
  2. 編譯:Swift、Objective-C、C++ 或原生模組編譯錯誤。
  3. 連結:缺少 framework、symbol 或架構不匹配。
  4. 運行:啟動崩潰、Metro 連線、資源路徑或原生初始化。

每次失敗都保存脫敏日誌:

mkdir -p logs

npx react-native run-ios \
  --simulator "<SIMULATOR_NAME>" \
  2>&1 | tee "logs/debug-$(date +%Y%m%d-%H%M%S).log"

不要把「清除所有快取」當成主要排錯方法。清理只能驗證是否存在暫存污染,不能解決 Bundle ID、原生 API、Pod 版本或架構設定錯誤。

Release Archive、簽名與 App Store Connect,要按狀態逐層驗收

Apple 的發布流程是先建立 Archive,再進行 Validate、Export 或 Upload。Archive 成功、導出成功、上傳成功、Apple 處理完成與提交審核,是五個不同狀態。(Apple Xcode 發布文件)

先在 Xcode 中選擇實體裝置發布目標,再建立 Release Archive。若使用命令列,可先確認 Scheme:

xcodebuild -list \
  -workspace ios/<PROJECT>.xcworkspace

命令範例必須使用佔位符:

xcodebuild archive \
  -workspace "ios/<PROJECT>.xcworkspace" \
  -scheme "<SCHEME_NAME>" \
  -configuration Release \
  -destination "generic/platform=iOS" \
  -archivePath "$PWD/build/<APP_NAME>.xcarchive" \
  DEVELOPMENT_TEAM="<TEAM_ID>"

實際專案可能需要額外的簽名參數,不應直接複製上述命令到生產流程。重點是確認以下關係一致:

  • Xcode Target 的 Bundle ID。
  • Apple Developer 中的 App ID。
  • App Store Connect 的 App Record。
  • DEVELOPMENT_TEAM 或團隊選擇。
  • Signing Certificate、Provisioning Profile 和 Entitlements。
  • Version 與 Build Number。

Apple 文件指出,首次上傳前需要建立 App Record,且上傳的 Bundle ID 與版本資訊會用來關聯 App Store Connect 中的 App。(Apple App Record 與發布準備)

上傳可使用 Xcode、Transporter 或其他 Apple 支援的方式。App Store Connect 會先處理上傳內容,處理完成後才會在介面中出現可用 Build。(Apple 上傳 Build 文件)

因此,驗收表應寫成:

  • Archive:已生成 .xcarchive
  • Validate:Apple 初步驗證沒有阻斷錯誤。
  • Export:成功生成可發布檔案,若流程需要。
  • Upload:交付到 App Store Connect。
  • Processing:等待 Apple 完成處理。
  • Complete:Build 可供 TestFlight 或後續發布使用。

Apple 目前的上傳文件列明,2026 年起上傳至少需要 Xcode 14 或更新版本;iOS App 若以 Xcode 構建,文件列出的構建版本為 Xcode 16 或更新版本。具體可用組合仍應以提交當日的 App Store Connect 支援版本為準。(Apple 支援的 Xcode 版本)

不要把 Build 顯示為 Processing 寫成「已上架」。只有在處理完成、選定 Build、填妥必要資料並提交審核後,流程才進入下一階段。Apple 亦提供不同上傳狀態的定義,應以狀態頁而不是本地命令退出碼判斷結果。(Build 上傳狀態說明)

簽名憑據的保護,比一次上傳成功更重要

遠端 Mac 具有完整 root 權限時,部署者應把簽名安全放在構建成功之前考慮。不要把 .p12、私鑰、App Store Connect API Key、密碼或團隊憑據提交到 Git,也不要在文章、Shell 歷史或普通文字檔中留下真實值。

較穩妥的做法是:

  1. 使用最小必要權限的 Apple Developer 或 App Store Connect 使用者。
  2. 優先採用自動簽名或受限制的 API 金鑰。
  3. 用秘密儲存或受限權限檔案注入憑據。
  4. 將命令中的 Team ID、Key ID、Issuer ID 和路徑改成佔位符。
  5. 任務完成後刪除暫存憑據及 Shell 歷史中的敏感命令。
  6. 租期結束、主機交接或人員離開時撤銷不再使用的金鑰。

例如只展示結構,不展示真實秘密:

export ASC_KEY_ID="<KEY_ID>"
export ASC_ISSUER_ID="<ISSUER_ID>"
export ASC_KEY_PATH="$HOME/.secure/<API_KEY_FILE>.p8"

Apple 文件亦指出,App Store Connect API 使用 JSON Web Token 進行授權;API Key 的角色權限應由團隊管理者按需分配。(Apple App Store Connect API 說明)

用決策條件選擇臨時租期或常駐構建環境

首次 Archive 成功後,不應立即承諾長期方案。先按構建頻率與故障代價判斷:

  • 若只在版本發布前使用,且每月構建次數不多:選擇可快速交付的臨時遠端 Mac,重點驗收環境是否能按鎖檔恢復。
  • 若每週需要多次 Debug、模擬器測試或 Archive:選擇可持續保留工作目錄的方案,避免每次重新安裝依賴。
  • 若需要 SSH 執行批次命令,也需要 VNC 處理 Xcode 與模擬器:選擇同時提供兩種連線方式的 Mac 環境。
  • 若構建流程涉及大量原生模組、私有 Pod 或多個 Scheme:先確認 root 權限、磁碟空間、憑據管理和環境持久性,再決定是否長期使用。
  • 若長期重負載構建、需要實體 iPhone USB 連線或專用硬體周邊:自購 Mac 可能更合適,遠端 Mac 不一定是最佳方案。

這種判斷比單純比較「雲端」或「本地」更可靠。對 Windows/Linux 開發者而言,本地編碼環境通常已經足夠;真正需要租用的是 macOS 原生構建能力,而不是另一台完整開發桌面。

若要比較不同地區或交付方式,可先查看 SFTPMAC 的繁體中文服務入口,再對照 Mac mini 租用價格頁。需要香港連線位置的團隊,也可查看 香港 Mac mini 租用方案

React Native 0.86 iOS 雲端構建的最終驗收清單

在把遠端 Mac 當成正式構建節點前,至少完成以下測試:

  • 重新登入遠端環境後,Git、Node、Ruby 與 CocoaPods 仍可用。
  • 從乾淨工作目錄重新恢復 JavaScript 與 iOS 依賴。
  • Debug 模擬器構建成功。
  • 關閉 Metro 後,能分辨是 Debug 依賴問題還是執行時問題。
  • Release Archive 成功生成。
  • Bundle ID、Team ID、Entitlements 與簽名設定一致。
  • Build 成功上傳並在 App Store Connect 完成處理。
  • 退出或撤銷暫存簽名憑據。
  • 保留工具版本、命令、錯誤分類與回滾方式。

如果目前方案是每次臨時找一台 Windows 或 Linux 主機再透過零散工具拼接 iOS 流程,常見缺點是沒有 Xcode 原生控制權、依賴環境難以重建、簽名憑據容易散落,並且不能穩定保留常駐構建狀態。對需要偶爾發布的開發者,SFTPMAC 的遠端 Mac 可作為按需使用的 macOS 節點;對頻繁發版的小團隊,則應優先評估 7×24 小時在線、root 權限,以及 VNC 加 SSH 的組合是否符合構建流程,再選擇合適的租期。

常見問題

Windows 或 Linux 開發 React Native iOS,是否一定要有 Mac?

如果只處理 JavaScript 或 TypeScript,不一定要本地 Mac。但原生 iOS 構建、Xcode、CocoaPods、模擬器、簽名與 App Store 發布仍需要 macOS。遠端 Mac 的價值在於把這些步驟集中到可控制的原生環境,而不是取代原有的編碼工作。

React Native 0.86 在遠端 Mac 上怎樣配置 Xcode?

先讀取專案檔案、鎖檔及 React Native 官方環境文件,確認 Node、Xcode、Command Line Tools、Ruby 和 CocoaPods 要求。接著記錄版本、設定活動開發者目錄、拉取 Git 原始碼,再按鎖檔恢復依賴。不要直接搬移本地生成目錄。

pod install 成功但 Archive 失敗,問題通常在哪裡?

CocoaPods 解析成功不等於 Xcode 編譯、連結和簽名成功。應依次檢查原生模組編譯錯誤、缺少 symbol、架構設定、Bundle ID、Entitlements、Build Settings 及 Release Scheme。保留完整脫敏日誌,避免用清快取掩蓋根因。

如何同步專案而不複製 node_modulesPods

使用 Git 或受控同步方式,只傳送原始碼、鎖檔、Podfile、建置腳本及必要設定。node_modulesPodsDerivedData 和 Xcode 使用者資料應在遠端 Mac 重新生成。這樣更容易發現真正的依賴差異,也能降低平台路徑污染。

上傳 App Store Connect 時如何保護簽名憑據?

不要把私鑰、API Key 或密碼放進 Git。使用最小權限的帳戶或 API 金鑰,透過受限權限檔案或秘密儲存注入構建流程,並在任務完成後刪除暫存檔。遠端主機交接或租期結束時,應撤銷不再使用的憑據。