出包日操作清单

代码写完之后,
在 Mac 上接着做什么?

本地继续用 Windows 或 Linux 开发,归档那天再把工程搬到云端 Mac。先确认连接与环境,再恢复依赖、导入签名材料,最后按你的框架生成 iOS 构建产物。

这里处理连接、浏览器远程桌面、环境初始化与计费问题;不代写业务代码,不代管 Apple 开发者账号,也不代替你完成发行资格与签名授权。

已经租好机器?从下方迁移清单开始。连接凭据与实例状态只在登录后的控制台内查看。

迁移时分开处理

工程数据、工具链、CI,各走一条路径。

本地 Mac 和 Windows 工程都可以从版本库恢复。先迁移可复现的配置,再迁移敏感材料;不要把旧机器的整个缓存目录直接复制过去。

数据交接

取回工程与签名材料

从自己有权限访问的 Git 仓库拉取工程。仓库地址通过环境变量提供,不要把访问令牌写进命令历史或截图。

  1. 同步分支与子模块,保留框架、包管理器的锁文件。
  2. 需要签名时,通过受控通道传入证书与描述文件;只导入本次任务必需的材料。
  3. 大文件优先走已启用且可连接的 SSH 传输;浏览器桌面是否支持文件上传,以当前连接界面为准。
git clone "$PROJECT_REPOSITORY" project
cd project
git submodule update --init --recursive
git rev-parse HEAD
git status --short

验证点:两端提交号一致。私有依赖的访问权限、额外资源与签名文件不会随代码自动恢复。

环境交接

先检查版本,再补齐依赖

先查看实例上实际可用的工具。不要假定每台机器预装了相同版本;Xcode 与工程要求不一致时,先处理兼容性再编译。

  1. 核对 Xcode 开发目录、版本与可用 SDK,确认命令行指向目标工具链。
  2. 使用 Homebrew 与 Brewfile 恢复项目需要的工具,再核对 CocoaPods、Flutter SDK 与 Node。
  3. Unity 工程使用匹配的编辑器版本,并在 Unity Hub 中确认 iOS Build Support。
xcode-select -p
xcodebuild -version
xcodebuild -showsdks
brew --version
brew bundle check
pod --version
flutter --version
node --version

验证点:有 Brewfile 才在其所在目录运行检查。命令不存在时先安装对应工具;Unity 使用授权由你自行确认。

自动化交接

桌面构建通过后,再接入 CI

先在交互会话完成一次构建,确认依赖与签名可用,再注册临时 self-hosted runner,避免把环境错误混进流水线排查。

  1. 从你使用的 CI 平台取得适配 macOS 与芯片架构的 runner 包和短期注册令牌。
  2. 在解压目录按平台说明注册,检查任务标签、工作目录与运行用户。
  3. 项目已有 fastlane 配置时,先列出 lane,再执行团队约定的构建流程。
./config.sh --url "$CI_REPOSITORY_URL" --token "$RUNNER_TOKEN"
./run.sh

bundle check
bundle exec fastlane lanes

验证点:runner 命令取决于 CI 平台,并非通用安装器。上述注册形式仅用于提供对应脚本的平台;到期前注销 runner、撤销令牌。

传文件不等于开了远程桌面就能拖进去。剪贴板内容类型、大小与文件传输入口由当前连接实现决定。需要 SSH 或 VNC 客户端时,先在控制台核对开放方式、凭据和连接地址;不要自行假定端口已开放。敏感材料不要放在公共下载地址,也不要附在工单中。

按工程类型继续

三条出包路径,终点不只是一句“编译成功”。

先用项目锁定的版本恢复环境,再处理平台依赖与签名。以下命令在对应工程目录执行;产物能否分发,还取决于签名配置、发行权限与目标平台要求。

Flutter:从工程得到归档与 ipa

前提:Flutter SDK 与项目要求匹配,iOS 工程、插件依赖和 Xcode 工具链可用,签名材料与应用标识对应。

flutter doctor -v
flutter pub get
flutter build ipa

先处理 flutter doctor -v 指出的 iOS 工具链问题。依赖恢复失败时区分网络、版本约束与私有包权限;不要反复执行归档命令掩盖前置错误。

预期产物:成功后核对 build/ios/archive 中的归档,以及 build/ios/ipa 中的导出文件。具体目录与导出行为以所用 Flutter 版本和构建输出为准。

只有归档、没有 ipa 时,继续检查导出与签名错误。构建完成不会自动将安装包提交到 TestFlight。

React Native:用正确的工作区归档

前提:Node、包管理器与项目锁文件匹配;采用 CocoaPods 的工程已经安装 iOS 依赖,并确认使用正确的 scheme。

node --version
bundle check
cd ios
bundle exec pod install
open .

存在 Gemfile 时使用项目约定的 Bundler 环境;未采用 Bundler 的项目按团队流程安装依赖。在 Xcode 打开生成的 .xcworkspace,不要误开缺少 Pods 依赖的工程文件。

预期产物:选择目标 scheme 和适用的设备归档目标,通过 Product → Archive 得到 .xcarchive,再在 Organizer 中按发行方式导出或上传。

模拟器运行成功不代表设备归档可用。若原生模块报错,保留首个编译错误和对应依赖版本,而不是只截最后一行失败摘要。

Unity:导出之后还要走完 Xcode

前提:Unity 编辑器版本与工程匹配,iOS 模块可用,第三方原生插件和资源完整,具备相应的编辑器使用授权。

xcodebuild -version
xcodebuild -list -project "$EXPORTED_XCODE_PROJECT"

在 Unity 中切换 iOS 构建目标并导出 Xcode 工程。使用 IL2CPP 的工程需要完成生成代码的原生编译;导出完成还不是可分发的安装包。

预期产物:在 Xcode 中处理签名、依赖和目标配置后执行 Archive,得到归档,再按发行流程导出 ipa 或上传。若插件生成了工作区,应打开工作区继续处理。

大工程先预算内存和中间文件空间。Apple Silicon M4 Pro / 64GB RAM / 2TB SSD 是目录中的大工程选项,但不承诺固定编译耗时。

第一次通过后,把“可复现”一起带走。

记录提交号、Xcode 与框架版本、依赖锁文件、所用 scheme、构建命令和产物路径。将可公开的配置纳入版本控制,签名私钥与访问令牌另行保管。下一次按天租 Mac 时,先恢复这份记录,而不是从头猜一次环境。

先区分桌面慢与构建慢

画面一卡一卡,先查连接;归档停住,先看日志。

鼠标移动延后、画面刷新慢,通常应从网络与显示设置排查;鼠标正常但编译长时间运行,则需要查看构建日志和资源占用。换一种远程连接方式不会自动修复工程错误。

  1. 01

    核对节点与网络

    先确认订单当前节点是否接近你的接入位置,再比较有线或稳定无线网络,暂停占满上行带宽的同步任务。需要改选节点时先看下一节,不要把“换节点”理解成原订单可以即时无损迁移。

    改善边界:地理接近只是筛选起点。运营商路由、跨区链路与本地拥塞仍会影响实际往返延迟。

  2. 02

    降低显示负担

    在当前远程连接界面提供的选项中降低画质、分辨率或帧率,关闭不必要的动态内容。一次只改一项,并记录修改前后的现象。

    改善边界:可以减少画面编码与传输负担,但不能缩短网络的物理往返时间,也不会让 CPU 编译任务因此更快完成。

  3. 03

    比较 VNC 客户端

    如果控制台提供对应连接信息,可使用 VNC 客户端比较同一实例的操作体验。浏览器方式适合直接进入桌面;客户端方式可作为排查连接实现差异的替代路径。

    改善边界:客户端可能提供不同的显示与剪贴板选项,但不会改变节点位置。文件传输能力仍取决于双方实现,不作统一支持承诺。

  4. 04

    保留错误现场

    连接失败时记录页面提示、发生时间与时区;构建失败时保留首个有意义的错误、执行命令和版本信息。截屏前遮盖密码、令牌、证书细节与私人项目内容。

    改善边界:截图能辅助定位,但不能替代可复制的错误文本。不要只提交“很卡”或“打包失败”而没有复现步骤。

节点参考用于选择方向,不是你这条线路的实测结果。

全部 5 个节点如下。区间对应给定辐射区,不构成任意城市到该节点的延迟承诺。

节点 → 辐射区 → 参考往返区间
节点辐射区参考往返区间
新加坡东南亚20~50ms
东京东亚30~60ms
首尔东北亚30~50ms
香港华南与东南亚20~40ms
美国东部北美东部与西欧25~35ms

区间参考,实际以接入网络为准。实时操作桌面时优先考虑接近你的节点;仅执行构建、回收产物时,还应同时考虑依赖下载与文件传输条件。

迁移前先确认订单

改节点之前,先把工程和租约分开。

节点是订单配置的一部分。本页不将同一订单的跨节点切换视为默认能力,也不承诺磁盘、连接地址或剩余租期能够自动转移。是否可以调整、如何处理费用与数据,先由控制台工单核对具体订单。

先问清楚,再操作原实例

提交订单号、当前节点、希望使用的节点与原因,并说明是否仍有运行中的构建。等待确认订单调整方式、可能的费用和操作步骤;不要在未确认前删除环境或假定新节点会继承旧实例状态。

若需要另行租用一台,先核对新订单的配置、周期与实时可用状态。旧订单如何结束或续租,仍按对应订单与服务条款处理。

把新实例当作一台新的 Mac

先推送未提交的代码并导出构建产物,单独备份必要配置、证书与描述文件。新实例重新核对工具版本、访问权限与签名,不直接假设旧磁盘内容已经迁移。

切换成功后更新 CI 的连接配置,注销旧 runner,撤销不再使用的令牌。到期数据处理以服务条款和控制台提示为准;不要把到期后的恢复当作备份方案。

让第一条工单可复现

把发生在哪一台、哪一步,一次说明白。

登录控制台,在工单入口新建请求,并关联需要核查的订单。控制台工单适合处理实例、连接、初始化与账单问题;无法登录时,可通过 support@testmini.com 联系。

提交前收齐这些信息

  • 订单与节点:订单号、机型、当前节点,以及问题对应的实例。
  • 时间与环境:发生时间、时区、本地操作系统、浏览器或 VNC 客户端版本。
  • 操作与结果:从哪个页面或命令开始、预期发生什么、实际看到什么。
  • 错误与证据:错误文本、脱敏截图、相关日志片段,以及能否重复出现。
  • 已尝试的方法:更换网络、调整画质、重新连接等操作及其结果。

涉及付款时,写明订单号、付款方式和控制台显示的状态;USDT-TRC20 可提供交易哈希,银行卡问题不要发送完整卡号、安全码或验证码。

工单正文可以按这个顺序写

把下列字段填入控制台工单,不必上传整个项目。

定位对象
订单号、节点、机型
发生时间
具体时间及所用时区
复现过程
操作顺序、命令、错误文本
环境信息
浏览器、Xcode、框架版本
排查结果
已经尝试的办法及变化

不要附带登录密码、私钥、签名证书原件或 CI 注册令牌。若支持需要进一步诊断,再按工单说明提供最小必要信息。

回复进度看工单,不把发出请求当作已处理。

支持沟通以亚太工作时间为主。这里不承诺固定分钟或小时内完成处理;收到工单后的回复与后续进展以控制台记录为准。补充信息请继续回复同一工单,并保留问题仍可复现的环境。若机器临近到期,先导出关键文件,再确认续租安排。

账单核查仅涉及美元结算的 USDT-TRC20,以及经 Stripe 的 Visa / Mastercard / Amex;实际可用网关以后端返回为准。付款确认可能受链上确认或发卡行处理影响,截图本身不等于付款已确认。

继续核对服务规则

技术步骤之外,还要确认租期与节点。

连接、构建、订单是不同的问题层。用对应文档确认前提,再决定继续排查、提交工单或租用下一台机器。

查问题

核对一天起租、浏览器与 VNC 的区别、加购计费、签名材料和租期结束后的数据处理。

查看常见问题

挑节点

结合所在区域与工作方式查看全部 5 个节点。参考延迟用于选方向,实际体验仍需结合接入网络。

核对节点选择

读服务条款

开始长时间编译前确认计费周期、续租、到期处理和使用边界,提前导出不可替代的文件。

阅读服务条款

出包前确认环境,卡住时带上记录。

已有订单就在控制台继续处理;还没租机,先按工程需要选择配置和节点。项目与产物由你备份,机器与订单问题交给工单核查。