查指南

从零出 iOS 包

在 Windows 或 Linux 写代码,在云端 Mac 完成 iOS 构建。先连上机器,再检查工具,最后处理依赖与签名。

已有订单?先在控制台确认实例状态与连接信息,不要把支付凭据当作连接密码。

先跑通环境

这三步只检查接入与工具。暂时不要导入生产证书,也不要一上来升级全部依赖。

  1. 核对连接信息

    登录控制台,打开对应订单与实例详情。核对节点、运行状态,以及页面提供的连接地址、端口和凭据。

    连接地址不等于订单号。若实例仍在开通中,先查看状态;若出现错误,附订单号提交工单,不要反复重置配置。

  2. 登录 macOS

    在本地 VNC 客户端分别填写地址、端口和密码。首次接入先用较低分辨率,确认键盘、鼠标与窗口操作正常。

    需要命令行时,使用实例提供的 SSH 连接信息。首次连接先核对主机指纹;指纹异常变化时停止输入凭据并核实原因。

    桌面卡顿不等于构建停止。先检查本地网络,再降低画面分辨率;纯构建任务可改用 SSH 执行。

  3. 检查开发工具

    确认已安装完整 Xcode,并打开一次完成组件初始化。命令行工具应指向本次构建要使用的 Xcode,而非仅指向独立工具目录。

    xcode-select -p
    xcodebuild -version
    xcodebuild -showsdks

    缺少 iOS SDK 时先补齐 Xcode 组件。只有许可协议提示时才处理许可;不要用切换目录掩盖实际缺失的 SDK。

用 Flutter

先查 doctor

把工程、依赖锁文件与需要的资源一起传到 Mac。沿用项目已有的 Flutter 版本,先排除环境问题,再改业务代码。

装齐前置工具

准备 Flutter SDK、完整 Xcode 与 CocoaPods。若工程指定 Flutter 版本或 Ruby 工具链,先按仓库约定安装,避免本地与出包机各用一套版本。

执行诊断后,逐项处理 iOS 工具链提示。设备连接提示不一定阻止归档;Xcode、SDK 与签名配置缺失则需要先处理。

区分两种验证

只想验证编译能否通过,可先运行不签名的 release 构建。它不能替代带签名的安装包,也不能直接作为分发产物。

准备导出 .ipa 时,在 Xcode 的 Signing & Capabilities 中核对 Team、Bundle Identifier、证书与描述文件,再执行正式打包。

按顺序执行

flutter --version
flutter doctor -v
flutter pub get
flutter build ios --release --no-codesign
flutter build ipa --release

最后一条命令需要签名配置完整。输出位置与导出方式以当前 Flutter 版本及命令输出为准,完成后把产物下载到本地验证。

先看失败层,再决定是否清理缓存
报错线索 先做什么 不要先做什么
CocoaPods not installed 检查 CocoaPods 是否安装,以及当前终端能否找到 pod 命令。 不要先删除整个 iOS 工程。
No profiles / signing 核对 Bundle Identifier、Team 与导出类型是否匹配,检查描述文件有效期。 不要把依赖错误与签名错误混在一起处理。
Deployment target 对照插件要求,统一工程与 Podfile 的最低 iOS 版本,再安装依赖。 不要只修改一个 target 后直接重试归档。

用 React Native

锁住依赖版本

先读取仓库中的 Node、Ruby 与包管理器约定。保留锁文件,让出包机复现团队已有环境,而不是重新挑选依赖版本。

先装 JS 依赖

按项目锁文件选择 npm、Yarn 或其他既有包管理器。下方命令适用于带 package-lock.json 的 npm 工程;其他工程沿用自己的安装命令。

若仓库提供 Gemfile,使用 Bundler 固定 CocoaPods 版本。没有 Gemfile 时才直接使用项目要求版本的 pod 命令,不要混用全局与项目工具链。

再开 workspace

安装 Pods 后打开 iOS 目录下的 .xcworkspace,而不是只打开 .xcodeproj。选择实际应用的 scheme,并使用 Release 配置归档。

Archive 前核对版本号、构建号和签名。归档成功后在 Organizer 中按测试或分发用途导出,模拟器构建产物不能代替设备安装包。

复现项目环境

node --version
ruby --version
npm ci
bundle install
cd ios
bundle exec pod install

Bundler 两条命令以工程包含 Gemfile 为前提。安装日志失败时,先保留第一处错误与相关版本,再尝试修复。

单独查 Hermes

Hermes 编译失败时,先核对 React Native 版本、Pods 锁文件、Xcode 版本与原生依赖兼容性。若日志出现脚本找不到 Node,检查构建脚本使用的 Node 路径;不要先关闭 Hermes 或删除全部锁文件,这会改变工程行为与依赖结果。

用 Unity

迁移导出工程

在 Windows 继续编辑游戏,在云端 Mac 完成 Xcode 编译与签名。迁移的是完整导出目录,不只是一个工程文件。

先核对模块

确认当前 Unity 版本及安装方式支持在本机导出 iOS 工程,并装好对应的 iOS Build Support。若本机不能导出,把 Unity 工程转到 Mac 后,使用相同编辑器版本构建。

导出前核对 Bundle Identifier、脚本后端、最低系统版本与插件平台设置,保存这次使用的配置。

完整传目录

将导出的 Xcode 工程连同资源、原生插件与构建脚本一起压缩传输。解压后检查目录层级,避免漏传隐藏配置或只传 .xcodeproj。

若插件依赖 CocoaPods,先运行它要求的依赖步骤,再打开生成的 workspace。不要直接从临时压缩目录构建。

分层查错误

IL2CPP 或链接失败先看第一处编译错误,检查原生库架构、framework 引用与插件版本。构建通过后,再处理证书与描述文件不匹配的问题。

大型资源包可评估 Pro 档,规格为 M4 Pro / 64GB / 2TB SSD;先核对资源体积与可用空间,不按项目名称判断配置。

重新导出 Unity 工程可能覆盖 Xcode 中的手工修改。把必要配置记录下来,能够脚本化的修改放回工程构建流程,避免下次出包重复操作。

认清这些词

连接、硬件与签名属于不同层。先认清词的含义,提交问题时就能少绕一步。

物理节点
实际运行 macOS 的 Mac 硬件。你选择的节点位置影响远程操作与文件传输路径,不改变项目的签名要求。
独享
租期内分配给你的独享物理机,非虚拟机,不与他人共享 CPU 与内存;仍需自行管理工程权限与构建凭据。
VNC
查看并操作远端图形桌面的连接方式。适合首次配置 Xcode 与检查归档,画面响应受本地网络和分辨率影响。
self-hosted runner
部署在自己管理机器上的 CI 执行器。构建会在这台 Mac 上运行;注册令牌、任务权限与清理策略需由团队配置。
统一内存
Apple Silicon 中由处理器与图形任务共同使用的内存。工程规模、并行编译及同时打开的工具都会占用这部分资源。
签名证书
参与应用签名的身份凭证,签名时通常还需要对应私钥。只导入证书而没有配对私钥,仍可能无法完成签名。
Provisioning Profile
关联应用标识、签名资格与分发用途的描述文件。它需要与证书、Team、应用能力及导出类型匹配。
.ipa
面向 iOS 设备的应用包。能生成文件不等于能在任意设备安装,实际安装或分发范围仍取决于签名与导出方式。

出包后再核对

把构建产物带走,也把租期与数据安排清楚。关掉远程桌面窗口,不等于停租。

还没做完,怎么续?

到期前进入控制台,查看当前服务的续费入口、账单和到期日。确认周期与金额后完成支付,再核对服务期限是否更新。支付已提交但状态未更新时,附订单号与交易凭据发工单,不要仅凭付款截图判断已续期。

包出完了,怎么停?

服务按天、周、月、季预付,到期不续即停。提前完成工作时,先导出文件,再在控制台核对服务期限与可用操作。退出 VNC、关闭 SSH 或手动关闭系统,都不能替代对订单计费状态的确认,也不代表自动退款。

到期后,文件还在吗?

到期停机后的数据按服务条款规定清除,不应把停机后的机器当成备份盘。请在到期前导出源码、.ipa、Archive、dSYM 与必要配置,并在本地检查文件可读。证书与私钥按团队策略安全备份;确认不再使用后,从远端移除敏感凭据。不要假定到期后还能重新连接或恢复文件。

续费能用哪些支付方式?

仅支持 USDT-TRC20 与 Visa / Mastercard / Amex(经 Stripe),全部以美元(USD)结算,实际可用网关以后端接口返回为准。涉及支付问题时,提交订单号、支付方式与交易状态;不要在邮件或工单中发送完整卡号、安全码、密码或私钥。

把报错说完整

已下单的问题走控制台工单;售前选型或暂时无法登录时,可通过联系页查看邮件渠道。问题按工单顺序处理,不承诺未经确认的回复时限。

附上复现条件

写明订单号、框架版本、Xcode 版本、操作步骤与失败时间,并标注时区。构建问题提供第一处错误及前后的日志,不只截最后一行“失败”。

移除敏感内容

日志先遮盖密码、令牌、私钥和客户信息。可用率申请另附受影响时间段;支付问题提供交易标识,不要附无关的工程源码。

若遇到连接中断,说明 VNC 与 SSH 是否同时受影响,以及本地网络切换后的结果,方便区分接入与构建问题。

还卡在哪一步?

带上订单号与第一处报错,我们从具体步骤接着查。