多数 React Native / Expo 团队日常在 Windows 或 Linux 写 JS,但 eas build --platform ios、裸 RN 的 pod install 与 xcodebuild 仍离不开 macOS。把独占远程 Mac当作 iOS 专用构建岛,用矩阵对齐美东 vs 亚太、M4 三档、CocoaPods / SwiftPM 缓存,并对照 EAS 构建分钟与短中期租期,比「全员买 MacBook」或「全靠 EAS 峰值」更易过预算。Runner 与磁盘分层见 GitHub Actions 自托管 Runner 与持久磁盘 FAQ;大仓冷启动见 CocoaPods / SwiftPM 与磁盘 FAQ。
一、美东与亚太:离谁更近
「美东」在控制台常对应美国西部等北美入口;「亚太」含新加坡、东京、首尔、香港。RN 团队要测的是:npm ci / yarn 制品、Git、Expo 与 Apple 相关 API 哪条路径更稳。同一 eas.json profile 在候选区各跑 3 次冷热构建,记录 pod install、xcodebuild 与上传 IPA 的 P95 再定区。
二、M4 三档怎么配 Expo / 裸 RN
档 A:expo prebuild 后轻量 archive、单 scheme 门禁。档 B:周更 TestFlight、常规 New Architecture 编译。档 C / Pro 向:多 flavor、重 use_frameworks! 与大型 Swift 混编。用 Runner 标签 把 eas build 本地复现 Job 与 PR 检查分到不同池,避免高配跑 lint。
三、CocoaPods / SwiftPM 缓存与磁盘
持久卷建议分区:~/Library/Caches/CocoaPods、SwiftPM 的 ~/Library/Caches/org.swift.swiftpm、DerivedData(按 Job 子目录)。key 绑定 Podfile.lock + Xcode major + RN/Expo SDK 版本。1TB 够单仓+周清理;2TB 适合多 PR 并行与保留近几周 .xcarchive。
四、EAS 分钟 vs 远程 Mac 租期(决策矩阵)
| 维度 | EAS 为主 | 1TB 远程 Mac | 2TB / 双机并联 | 单机 M4 Pro |
|---|---|---|---|---|
| 成本曲线 | 按分钟,峰值贵 | 周/月租可摊薄 | PR+夜间分池 | 重编译单队列省运维 |
| 缓存可控性 | 平台托管 | Pods/SwiftPM 可常驻 | 高(分散峰值) | 高(集中) |
| 典型组合 | 低频发版 | 日构建低于 EAS 配额线 | 多仓 monorepo | 大模块单线 release |
混合常见:PR 用远程 Mac 自托管,Release 仍走 EAS;或发版冲刺按天顶配,平峰按月低档。价目以 定价页 为准。
五、GitHub Actions 自托管 Runner 落地
在远程 Mac 安装 actions-runner,label 如 macos-arm64-expo;workflow 用 runs-on: [self-hosted, macos-arm64-expo]。流水线典型步骤:npm ci → npx expo prebuild --platform ios(若 managed 转裸)→ pod install → xcodebuild / Fastlane。密钥用 GitHub Environments;与 EAS 的 EXPO_TOKEN 分环境存放。
六、SSH / VNC 验收清单
- SSH:密钥登录成功;
xcode-select -p指向完整 Xcode;node -v/pod --version与 CI 一致。 - Runner:
./run.sh --check通过;试跑 dummy workflow 能接单。 - VNC:仅排障账号可登;能打开 Xcode 与模拟器;大文件走
rsync不经剪贴板。 - 磁盘:缓存分区可写;
df -h余量大于 20% 再接入生产队列。
七、FAQ
- 只用 EAS 还需要远程 Mac 吗?调试原生模块崩溃、证书冲突、
pod依赖冲突时,本地或远程 Mac 能直连 Xcode 调试,省去反复排队 EAS 分钟的等待。低频发版可纯用 EAS;日构建超 EAS 配额线时远程 Mac 更划算。 - Windows / Linux 能直接编译 iOS 吗?不能,WSL 和容器均无法运行 Xcode;必须接入 macOS 节点。Metro 与 Jest 可留在 Windows/Linux,仅把
pod install、xcodebuild、签名与上传四个环节路由到远程 Mac。 - 并联两台会抢 CocoaPods 缓存吗?每台机各自独立 DerivedData;只读 Pods 缓存可挂载共享卷,写时加
flock或用 Git worktree 隔离,避免竞争。 - 美东还是亚太?怎么选节点?不要看厂商地图,实测从主力研发地到候选节点的
ssh -vRTT 与git fetch时长。亚太研发团队通常新加坡/东京比美东快 80–150 ms;北美团队则相反。 - 1TB 够用吗?什么时候需要 2TB?单仓 + 每周手动清
.xcarchive,1TB 够用。多 flavor 白标、保留 dSYM 崩溃符号、或多分支并行 Job 不立即清理 DerivedData,建议 2TB。 - 发版冲刺完要不要退节点?推荐短租策略:平时按月租 1 台 Tier B,发版周按天租第二台跑并联 PR + Archive,TestFlight 上传后即退还,控制总成本。
- Runner 标签在多仓冲突怎么处理?按仓库或 App 加后缀(如
macos-arm64-appA),workflow 的concurrency组再加仓库名,防止 Release Job 把 PR 检查的并发位全占满。 pod install在 CI 失败但本地正常?99% 是 Ruby 版本漂移:用bundle exec pod install并提交Gemfile.lock,确保 runner 环境与本地 Homebrew Ruby major 版本一致。- 能中途换区吗?换区取决于目标区的库存,可在 定价页 确认当前可用机型。建议先按周租试跑延迟,再决定是否切换到月租,避免提前绑定。
在 Mac mini 上把 RN iOS 链路跑顺
远程 Mac 解决地理与弹性,桌边仍建议一台同代 Apple Silicon + 同 major Xcode 的定标机复现「我机能编过」。macOS 上 Homebrew、SSH、钥匙串与 Xcode 一体;M4 统一内存利 RN 新架构编译;Mac mini 约 4W 待机、静音,适合作 7×24 Runner 或第二验证机;Gatekeeper / FileVault 利无人值守。
若你正把 Expo iOS 从 EAS 峰值迁到可预测的租期成本,先到 Macstripe 首页 对照三档 M4 与亚太/美西节点;Mac mini M4 仍是 2026 年最具性价比的定标与扩容起点。