ARTICLE · 1206298
1天跑通三个平台:一个遥控App的安卓/iOS/鸿蒙研发沉淀
需求来自一次非常具体的现代化改造:把一个运行多年的古老 MVC 架构 PC 端配置工具,完整搬到 Android、iOS 和鸿蒙三端手机。原工具沉淀了设备控制、板卡配置、UID 云转发等大量隐性规则;我们要做的不是重新画三个界面,而是在一个假期、两天之内完成需求复刻、协议验证、自动回归和三端上架。本文复盘这条从遗留系统到三端产品的完整研发流水线。
〇、先报成果:研发跑通,发布状态分层
先说清楚"这文章不是理论总结,是刚发生的实战复盘":
Android:版本 2026.10.17.7 已完成构建、测试,并发布到 FIR 内测分发页;这里的“已发布”指内测分发,不等同于 Google Play 商店上架。
iOS:版本 2026.10.17、构建号 26101708 已在 App Store Connect 可见,审核物料已补齐;当前不能表述为“已通过审核”。
鸿蒙:本文保留三端方法论,但当前 ComputerMonitor 仓库没有鸿蒙工程和 AppGallery 审核回执,因此本轮不对鸿蒙发布状态作已提交或已上线判断。
这轮实践的关键词仍然是快,但“快”必须建立在状态准确、证据可追溯的基础上。Android 已完成内测分发,iOS 已进入 App Store Connect 的版本准备阶段,鸿蒙则需要在对应工程与发布后台补齐证据后再更新状态。下面拆开讲支撑这套效率的工程方法。
一、背景:这不是"一套代码",是业务与协议的跨端复刻
需求的源头并不是一个从零设计的新产品,而是一套已经运行多年的 Windows PC 端配置工具。它采用典型的 C++/MFC MVC 架构:界面、业务状态和 TCP 协议处理长期耦合在控制器中,代码古老但业务经验密集。设备控制、配置读写、地址发现、UID、局域网直连和云代理穿透等规则,很多没有独立规格文档,只存在于旧代码分支、按钮事件和现场使用经验里。我们的第一步因此不是写手机页面,而是从遗留实现中抽取稳定协议、业务约束和异常边界,再把它们翻译为三端共同的需求基线。
Android:Java + XML Views,Android Gradle Plugin 8.7.3、Gradle 8.9、JDK 17、compileSdk / targetSdk 35;
iOS:Swift + SwiftUI,使用 Xcode 构建与 Archive,目标 App Store Connect;
鸿蒙:文章中的 ArkTS / hvigor 内容来自三端方案参考;当前 ComputerMonitor 仓库未包含鸿蒙工程,相关实现与 AppGallery 状态需要在独立工程中验证。
很多人会以为这是"一码三吃"的跨端工程。但现实是:三端各自用着完全不同的技术栈和组件范式,我们做的是把同一套硬件协议和业务行为在三个平台上"各自正确地实现一遍",而不是共享一套 UI。这也正是全文所有矛盾与反思的起点。
三端首页(左起:Android / iOS / 鸿蒙)



二、先聊底层:协议是为多端对齐"定海神针"的那一环
三端最不能漂移的,就是协议。我们把它当成比"约定"更硬的东西来治理——用一个 8 字节帧为例:
55 ADDR FUNC D1 D2 D3 D4 CHECKSUM
第 1 字节
55是帧头;ADDR是板卡地址;FUNC是功能码;后 4 个字节是参数(比如 32 路开关位的比特掩码);
CHECKSUM是前 7 字节和的低 8 位。
暂时无法在飞书文档外展示此内容
协议实现落在各端自己的工程结构里:Android 主要是 RelayProtocol.java 与 mySocket.java,iOS 是 RelayProtocol.swift 与 DeviceClient.swift;鸿蒙如继续实现,应在独立工程的 protocol / service 层保持同样的帧定义与测试向量。新增“读取 UID”“读取板卡地址”等命令时,先更新协议规格,再分别进入各端实现。
我们的做法是:每一次协议补充,先沉淀成文档、再落到三端实现,并且每一端都必须有对应的"读协议-解析返回"的单元测试。这样当 Android 侧发现"云转发持续返回无关帧导致读取卡死"时,修的是 Socket 的超时策略(加总读取截止时间),而不是去改协议本身——协议层永远是稳定的,变的只是各端的网络与状态处理。
一句话:跨端对齐最该对齐的,不是像素,是协议。协议一致,其它分歧都是局部问题。
三、通用研发规范:让三端都能跑起来的"最小底座"
多端并行最容易出现的问题是:本地能编译、换台机器就崩。我们为此沉淀了几条通用规范:
1. 环境可复现,脚本化到一台新机器
Android 端我们写了一套环境脚本(macOS 的 setup-android.sh、Windows 的 setup-android-windows.ps1),把 SDK、JDK 17、模拟器、Gradle 缓存一次性装到约定目录:
# Windows
.\scripts\setup-android-windows.ps1
.\scripts\android-env-windows.ps1
.\gradlew.bat testDebugUnitTest assembleDebug
iOS 生成并提交 xcodebuild-*.log 便于排查 xcodebuild 版本/命名问题;鸿蒙则使用官方的 hvigor 与 build-profile.json5。
关键点:版本锁死。比如 Android 明确 Gradle 8.9 只兼容 JDK 1.8~22,若误选 JDK 25 会直接拒编。这种"版本兼容表"要写进 README,降低 AI 或新人踩坑的概率。
2. 版本号用日期——三端统一的心智模型
我们放弃了递增的 v1.2.3,改为当天日期即版本号:
Android versionName = "2026.10.17.7"
Android versionCode = 26101707
iOS MARKETING_VERSION = "2026.10.17"
iOS CURRENT_PROJECT_VERSION = 26101708
对外版本采用 YYYY.MM.DD,同一天多次发布可追加序号;构建号采用 YYMMDDNN。这样三端版本一眼能对上,同时满足 App Store Connect 对已上传构建号不可复用的要求。
3. 把发布脚本当成一等公民
发布到 fir/betaqr 我们写成脚本,并且强制版本号从构建配置自动读取,而不是脚本里写死:
DEFAULT_VERSION_NAME="$(sed -nE 's/.*versionName = "([^"]+)".*/\1/p' app/build.gradle.kts | head -n 1)"
这个改动的直接教训是:脚本里硬编码的上一个版本号,会在一周后安静地发布出一个"旧版本"。敏感信息(如 API Token)一律走环境变量,绝不进代码库。
四、从古老 MVC 到三端商店:完整自动研发流水线
两天完成三端的关键,不是让 Agent 无限制地产生代码,而是把研发拆成一条可复刻、可判定、可回滚、可发布的流水线。每一阶段都有明确输入、产物和放行条件,Agent 负责加速执行,测试和商店规则负责给出客观反馈。
0. 先看治理框架:研发到发布的四阶段门禁
完整流水线先被压缩为四个不可混淆的阶段:规划、开发、验收门禁、定稿发布。前两阶段追求速度,第三阶段负责给出客观的对错反馈,第四阶段才允许产生面向用户和商店的正式结果。

阶段 | 核心动作 | 必须产出 |
|---|---|---|
1. 规划 | 明确需求、范围、协议、验收标准和测试方案 | 跨端需求复刻包与可执行验收清单 |
2. 开发 | 按现有架构实现,保护未提交改动,补齐单测与文档 | 三端实现、测试代码和变更说明 |
3. 验收门禁 | 运行单测、构建、模拟器或设备、异常场景、截图和报告 | 可复核的绿灯结果与失败证据 |
4. 定稿发布 | 更新版本、核对 diff、提交推送、脚本上传、公开页复核 | 可追溯的 commit、安装包和发布记录 |
硬规则:第 3 阶段未通过时,默认不得执行 git push、fir 发布或商店提交。只有用户明确要求跳过,并且风险被记录,才允许带风险放行。
这道门禁解决了 AI 辅助开发中最危险的问题:Agent 不能因为“代码已经写完”就把任务判定为完成。完成的定义必须是实现存在、测试通过、产物可用、发布可追溯。下面的遗留系统取证、三端复刻和自动化测试,都在这四阶段框架内运行。
1. 先做遗留系统取证,而不是直接重写
古老 PC 工具没有完整 PRD,真实需求散落在 MVC 控制器、按钮事件、Socket 收发、配置文件和用户操作习惯中。我们先建立“遗留行为证据表”:输入是什么、发什么协议、期待什么响应、超时如何表现、配置如何保存。只有被代码、硬件响应或用户场景验证过的行为,才进入三端需求基线。
2. 把需求变成可复刻的三端规格
每个需求不再写成“安卓加一个按钮”,而是写成跨端行为合同:入口位置、字段含义、协议帧、成功结果、失败提示、持久化规则、兼容策略和验收用例。Android、iOS、鸿蒙分别用本端组件和架构实现,但输入输出与异常语义保持一致。
3. 一张图看完整流程
暂时无法在飞书文档外展示此内容
这不是单向“写完即结束”的瀑布。商店审核、真机网络、客户设备和线上日志都会形成新证据,再回流到遗留行为取证与规格层。只要规格和测试先更新,下一轮仍然是三端同步复刻,而不是三套代码各自打补丁。
4. 五道回归卡点决定能不能进入发布
卡点 | 验证内容 | 放行标准 |
|---|---|---|
协议单测 | 帧生成、校验和、UID、板卡地址、响应解析 | 三端核心用例全部通过 |
网络回归 | 局域网直连、UID 云转发、长连接复用、超时与脏缓冲 | Mock TCP 通过,关键链路真机验证 |
UI 回归 | 核心页面、字段、状态、错误提示和响应式布局 | 基准截图无非预期变化 |
构建质量 | 单元测试、Lint、编译、签名与安装 | 构建零错误,产物可安装启动 |
同步清单 | 需求、文案、协议、版本和发布状态 | 三端状态清晰,无遗漏项 |
5. 自动开发不是“自动写代码”,而是自动闭环
Agent 接收同一份需求复刻包,分别进入三端仓库,先读取本端架构与历史约束,再完成实现、补测试、运行回归、生成构建产物。任何测试失败都会成为下一轮修复的明确输入。只有全部卡点变绿,流程才进入版本更新、签名、上传和商店提交。
需求入口:业务变化先形成跨端规格与验收用例;
并行实现:三端按各自组件体系开发,不强行共享 UI 代码;
自动判定:测试、截图和构建结果直接判断对错;
统一版本:日期版本关联同一批三端需求;
自动发布:脚本读取版本、注入密钥、构建签名并上传分发或商店;
反馈回流:审核问题和设备问题沉淀为新用例,避免再次发生。
真正可持续的自动开发公式:稳定规格 × 三端复刻 × 自动回归卡点 × 可重复发布脚本。代码生成只是其中一环,能够稳定判错和自动上架,才构成完整生产力。
6. 上架自动化的边界
可以自动化的是版本号、构建、签名、产物校验、上传、发布记录和状态通知;仍需人工判断的是隐私合规、权限用途、商店文案、截图表达和审核申诉。我们的目标不是绕过审核,而是让机器承担重复劳动,把人的时间留给产品判断和合规责任。
五、自动测试:给 Agent 一双"看得见对错"的眼睛
这部分的收益是这次研发里最出乎意料的。我们给 Android 端配了足够厚的测试网:
单元测试:覆盖协议编解码、
.cmd持久化迁移、连接池路由、Socket 超时等核心逻辑;Paparazzi 截图测试:无硬件、纯 JVM 渲染出 UI 截图,跑一遍就知道布局有没有被改飞;
模拟器走查:Android 15 / API 35 模拟器逐页点一遍,产出多张截图;
Mock TCP:直连、云转发两条链路都能在无真机时被测试;
Lint:目标是 0 errors。
每次改动后,固定跑一遍这条红线:
./gradlew testDebugUnitTest assembleDebug
为什么这对 AI 辅助开发特别重要
我们大量使用 AI Agent 改代码(改协议字段、加"读取地址"按钮、修 UID 云转发逻辑)。Agent 最大的不确定性是"它以为对了"。测试反馈就是它的"对错裁判":
改完协议解析,有单测告诉我"这个 UID 该被解析成 16 字节,你解析成了 8 字节";
改完 UI,Paparazzi 截图能立刻看出按钮挤到哪去了;
改完 Socket,有专门用例验证"即使持续收到无关字节也必须按时超时退出"。
可验证、可评估的环境,决定了 Agent 修 bug 的效率不是一个数量级而是好几个数量级的提升。没有这套反馈,Agent 容易陷入"改一行、猜一下、再改"的盲打循环;有了它,Agent 说"我修好了"的时候,我们真的信。
反思一:投入在"让结果可被自动评判"上的时间,回报率远高于投入在"多写几行代码"上的时间。
六、三端并行:怎么"分",怎么"对齐"
多端研发刻意不共享 UI、不强行一码三端。当前仓库中的 Android 与 iOS 各自独立演进,只共享协议、字段含义、异常语义和验收用例;鸿蒙若在独立工程继续实现,也应遵守同一份行为合同。
并行时最大的挑战不是并行本身,而是"对齐"。尤其在总共只有 2 天的时候,每一分钟的重复解释、来回返工都是奢侈品——下面这三条反思,实际上就是我们用 2 天时间压力逼出来的取舍。
反思二:多端之间"严格 UI 对齐"几乎不现实
Android 使用 Java + XML Views,状态由 Activity、Adapter、Repository 和持久化配置协作;
iOS 使用 SwiftUI + ObservableObject,状态变化直接驱动界面刷新;
鸿蒙方案可使用 ArkTS 的 store / service / protocol 分层,但必须在独立工程中以实际代码和测试验证。
三种范式里"一个按钮"的呈现方式、生命周期、状态管理完全不在一个维度。要求三端像素级一致,既不经济也无必要——我们改为对齐"信息结构 + 交互路径",即关键字段、可读性、操作流程一致,具体视觉允许平台各自发挥。
反思三:组件设计思路有本质差别,"复用"要克制
Android 继续沿用现有 View 与 Adapter 边界,避免为了形式统一引入不必要的架构重写;
iOS 使用 AppStore、DeviceClient 和 SwiftUI View 分离状态、通信与展示;
鸿蒙只有在存在可运行工程后,才能决定 store、service 与组件的实际复用边界。
表面看起来都是“一个开关列表”,但组件边界、状态归属和复用粒度完全不同。我们的取舍仍然是:协议层统一、业务行为统一、UI 层各端自治。真正可以互相参考的是 RelayProtocol.java、RelayProtocol.swift 这类协议解析、校验和测试向量,而不是直接共享 UI 代码。
Android 设备设置页(板卡地址、UID 云转发、读取UID / 读取地址)

七、值得一看的落地细节(剪自真实迭代)
挑三个我们在三端迁移中都遇到的具体点:
问题 | 我们怎么做 | 效果 |
|---|---|---|
命令发出去没返回,页面一直转 | 给读取加"总截止时间",持续收到无关帧也必须按时退出 | 不再卡死,能给出明确失败提示 |
板卡地址是十六进制,用户不懂 | UI 用十进制输入(1-254),内部仍存十六进制 | 体验友好,协议不变 |
长连接复用 vs 换设备 | 首连发 UID,后续复用;IP/端口/UID/云服务器变了就重建连接 | 既省流量又不串设备 |
这些点如果只在 Android 修、iOS 和鸿蒙不跟进,就会造成"同一份协议,三端行为不一致"的暗坑——所以每一项我们都要求三端同步落地,并各自补测试。
八、总结
本轮可确认的结果是:Android 已完成 FIR 内测分发,iOS 构建已进入 App Store Connect 并完成审核物料准备;鸿蒙状态需要在独立工程和 AppGallery 后台继续核验。比“几个端都上桌”更重要的,是下面这些可复用判断:
协议是对齐的锚点:跨端先固定协议,别让 UI 分歧污染协议层。
环境与版本可复现:脚本化、版本锁死,是新机器和 AI 都能顺利入手的底线。
测试网就是 Agent 的"对错裁判":可验证可评估的环境,是 AI 辅助开发效率跃升的前提。
UI 严格控制成本、组件不复用:三端 UI 只对齐信息与交互,不强求像素,不自造伪复用。
最后送一句我们踩坑踩出来的话:
你有多容易知道"自己错了",你就有多快能修对。——这一个原则,同时适用于我们的测试基建,也适用于我们依赖的 AI Agent。
九、机会点:把"复刻"做深,效率上一个数量级
这 2 天不只是交付了三端,更重要的是验证出一条可复制、能被再放大的方法。机会点就藏在三个杠杆里:复刻同步、回归卡点、统一版本。
1. 从"三端各写各的"到"一个需求复刻进三端"
默认动作是:需求一到,三端各从零实现、各回一遍问题、各做一次回归,同一件事反复理解 N 遍。而这次我们做到的是:因为协议和行为先固定,一次需求 = 同一份规格的三端方言。把每一次交付都从"从零写"切换成"按规格复刻",实现就具备规模化复制的可能,这是第一个数量级的来源。
2. 定好"测试回归卡点",让每端都有可判对错的裁判
把测试网升级为"卡点闸门",三端各自约定死这些过闸条件,不满足不合并:
核心协议单测:编解码、解析返回必须被用例覆盖;
UI 回归截图:无硬件渲染出界面,改完立刻看到布局是否被改飞;
Mock 直连 + 云转发链路:无真机也能验两条通道;
Lint / 编译零错:进 CI 的前置硬门槛;
三端同步清单:一个需求必须三端都补齐才放行,杜绝"只有安卓修了"的暗坑。
卡点自动化后,回归从"发布会前的恐慌"变成"每次改动的日常动作";AI / 新人每改一次都能立刻知道对错,返工轮次大幅下降,这是第二个数量级的来源。
3. 同步上线三端,消除"版本错位"
用日期版本号统一三端语义,需求按"三端同批"排期,功能评审以协议与行为为准、UI 各自自治。这样测一轮 == 覆盖三端、反馈一次 == 修三处、发一版 == 三端对齐,版本错位带来的沟通与返工成本被直接抹平。
"20 倍"从哪来
把同一个需求,在传统方式与这套方式下各拆一遍时间去向:
环节 | 传统 | 新模式 |
|---|---|---|
规格理解 | 3 端 × 各理解一遍 | 规格定一次,三端复刻 |
实现 | 3 端从零手写 | 模板 + 复刻 |
回归验证 | 人肉点点点 | 卡点自动化判定 |
版本对齐 | 手动对齐 / 易错位 | 同步放行 |
返工轮次 | 改完即上、错了再改 | 跑绿才进、一次到位 |
结果是一个需求从"3 份实现 + 3 份人肉回归"变成"1 套规格 + 1 套卡点 + 同步放行"。量级落在约 6~20 倍,自动化覆盖越深,越接近上限——这也是为什么 I/O 值得继续投入在"卡点质量"上。
落地路线:把它做成常态
短期:三端各自把卡点脚本建好并跑绿;
中期:把"一个需求"固化成清单模板:需求 → 三端分支 → 三端卡点 → 同步发布;
长期:卡点进 CI,Agent 跑绿灯自动并入,形成"复刻即同步"的流水线。
机会的核心不是"写了几个端",而是一套规格 + 一套卡点撑起三份输出。把这套固化下来,从 2 天一个版本,变成随时可复制的标准产能。
边界与代价要写清楚:UI 只对齐信息与交互,不强求像素;组件不共享代码、只共享规格与卡点;"20 倍"依赖测试覆盖的深度而非数量——先有可靠的对错裁判,才有放大的底气。
十、本轮研发与发布平台交互复盘
这一节记录 ComputerMonitor 本轮可以由仓库、构建产物和发布后台共同证明的结果。它补充了前文的方法论,也把“代码写完”“安装包可用”“构建已上传”“审核通过”“正式可售”这几个经常被混为一谈的状态彻底拆开。
截至本次更新:Android 2026.10.17.7 已发布到 FIR 内测页;iOS 2026.10.17(26101708)已在 App Store Connect 可见并完成审核物料准备;当前没有足够证据确认 iOS 已审核通过或正式可售,也没有当前鸿蒙工程与 AppGallery 回执可供核验。
1. 研发侧最终落地
范围 | 最终实现 | 工程结论 |
|---|---|---|
Android | Java + XML Views;AGP 8.7.3、Gradle 8.9、JDK 17、SDK 35 | 保留遗留工程结构,在现有边界内升级构建链路,比重写更快、更可控 |
iOS | Swift + SwiftUI;独立 AppStore 状态层和设备通信层 | 按 iOS 原生交互重建相同行为,不照搬 Android 控件层 |
共享能力 | 多设备、局域网直连、16 位 UID 云转发、32 路通道、在线检测、控制延迟、品牌资源 | 共享的是协议、字段、异常语义和验收标准,而不是 UI 代码 |
本轮最关键的功能闭环包括:
每台设备独立保存连接方式、目标地址、板卡地址、云服务器和控制延迟;
16 位 UID 按奇偶路由到默认云转发节点,并允许设备级覆盖服务器配置;
32 路通道统一编辑名称与绑定 IP,首页显示继电器状态和主机在线状态;
开关机与强制关机延迟写入协议固定字节,范围统一为 1–255 秒;
Android 和 iOS 统一产品名、Logo、日期版本规则和发布记录。
2. 测试与交付证据
Android:debug / release 两个变体各 18 项单元测试通过,Lint 0 error,APK 可安装运行;
协议:对开关机与强制关机指令抓包,确认配置延迟写入正确字节;
UI:在模拟器验证首页、设备设置、云转发和 32 路通道列表;
iOS:Release Archive 成功,最终 Info.plist 包含 iPad 多任务要求的四个方向;
审核物料:已生成 iPhone 灵动岛中等显示屏、iPhone Duo 外屏/内屏、iPad 13 英寸截图,均为平台接受的精确尺寸且无 Alpha。
3. 与各发布平台的实际交互
平台 | 当前状态 | 实际交互 | 沉淀 |
|---|---|---|---|
GitHub | main 已同步 | 绑定远程仓库,统一提交作者;通过指定 SSH 身份解决 Permission denied | 源码身份、SSH 身份和发布身份必须在开始前核对 |
FIR | Android 内测已发布 | 上传 debug APK,核对远端名称、日期版本、构建号和下载页;缺少 release 私钥时明确记录签名级别 | 内测分发完成不等于应用商店正式上架 |
App Store Connect | 版本与构建可见,待继续提交审核 | 接受开发者协议、创建 App 记录、匹配 Bundle ID、处理证书与账号、修复 iPad 方向、匹配版本号、补齐截图和审核材料 | Archive、Upload、Processing、选择构建、提交审核、可售是六个独立阶段 |
AppGallery | 本轮未核验 | 当前仓库没有鸿蒙工程、签名产物或后台审核回执 | 没有构建和后台证据时,不应把“计划提交”写成“审核中” |
4. App Store Connect 交互中真正踩到的坑
App 记录和 Bundle ID 必须先对齐。二进制使用
Pannet.RelayController.ComputerMonitor,后台记录也必须绑定同一标识;否则 Xcode 无法定位目标 App。登录 Xcode 不等于拥有可用的分发能力。曾出现
IDEDistribution.DistributionAppRecordProviderError,同时本机只有 Apple Development 身份。账号访问、协议接受、Apple Distribution 证书和钥匙串访问是不同检查项。iPad 多任务会反向约束 iPhone App 的方向声明。只声明竖屏会收到 Invalid bundle;必须重新 Archive,并在最终产物中包含四个界面方向。旧 Archive 不会因为源代码已修复而自动变正确。
上传成功后,构建也可能不出现在待提交版本里。后台最初是
1.0 准备提交,二进制却是2026.10.17,版本不一致时构建不能被该版本选择。版本号与CFBundleShortVersionString对齐后才进入正确链路。构建号必须只增不减。方向修复后使用 26101708 重新 Archive,避免复用已经上传或处理过的构建号。
截图尺寸以当前后台设备组为准。旧的 1284×2778 属于另一显示屏分组;当前补充的是 1206×2622、Duo 外屏 1398×2034、Duo 内屏 2007×2853 和 iPad 2064×2752。
5. 发布状态要用状态机管理
后续发布记录不再只写“成功/失败”,而是固定使用以下状态:
源码已合并;
测试与静态检查已通过;
安装包或 Archive 已生成;
产物已上传并被平台接收;
构建处理完成并可选择;
元数据、隐私、截图和审核备注已完成;
已提交审核;
审核通过;
已发布且用户可下载。
这样可以避免“Xcode 显示上传完成”被误写成“App Store 已上线”,也可以避免 FIR 内测发布和正式商店发布使用同一个状态词。
6. 下一次可直接复用的发布清单
构建前锁定版本号、构建号、包标识和 Git 提交;
先跑协议测试、单测、Lint、Release 构建和模拟器截图;
发布前检查签名身份、账号权限、开发者协议和目标 App 记录;
上传后同时核对平台版本、构建处理状态和可选构建列表;
截图按后台实时显示的设备组准备,统一检查尺寸、格式和 Alpha;
硬件类 App 提前准备审核录屏或审核期可访问的测试设备;
任何平台反馈都回写为测试或发布门禁,禁止只在聊天记录里修一次。
最终结论:三端研发的难点不是写三份界面,而是同时管理协议一致性、构建环境、签名身份、平台状态和审核证据。真正可复制的能力,是让每次发布都能回答三个问题:现在处于哪个状态、证据在哪里、下一步由谁完成。















































































