把 Web 版做成可长期使用的客户端
将轮询快照替换为 PTY/WebSocket,接入 xterm.js,完成认证、断线重连、离线不补发与 stale target 拒绝。
SessionPlane · Client decision
React Native 可以做,但它不该成为第一版的前置条件。先用网页把“看见同一会话、明确目标后输入”做可靠,再把通知、Face ID 和系统入口放进原生壳。
原生 App 的优势集中在“系统集成”,而 SessionPlane 最难、最核心的部分是“终端正确性”。终端生态本来就在浏览器侧,因此先做 PWA 能更快验证核心,又不会堵死 React Native。
这里比较的是第一版应该承担什么,而不是哪项技术“更高级”。背景连接在 iOS 上无论网页还是原生都不能被当作永久在线链路;可靠通知应由服务端推送,前台再重连实时会话。
| 维度 | PWA | 纯 React Native | 分阶段混合 |
|---|---|---|---|
| 终端渲染 | 直接使用 xterm.js 和 DOM | 需要另找原生终端,或仍嵌 WebView | 共享同一套 Web terminal renderer |
| 首版交付 | 同一 URL 覆盖 iPhone、iPad 与桌面 | 需要签名、构建、安装与版本分发 | 先发布 Web,原生壳不阻塞核心 |
| 通知 | iOS 16.4+ 的 Home Screen Web App 支持 Web Push | APNs/Expo、通知动作与 badge 更完整 | 先 Web Push,再按真实需求升级 |
| 本地安全 | 用 HttpOnly 会话、Passkey 等 Web 能力 | Keychain、SecureStore、Face ID 更直接 | 服务端安全模型不变,原生再加强设备门禁 |
| 后台实时连接 | 退到后台后按断线处理 | 普通 App 在后台通常也会被挂起 | 统一设计成重连 + 服务端通知 |
| 维护面 | 一套 UI 与发布链 | 移动端独立构建与设备验证 | 只在原生收益明确时增加第二发布面 |
Target architecture
Host、session stable ID、pane generation、只读输出和显式输入命令都属于协议层。它们不应该知道前端来自 Safari、Home Screen PWA,还是 React Native App。
session 列表、终端观察、命名、受控输入、断线与过期目标提示。
TypeScript 数据合同、WebSocket 事件、目标世代校验;终端用 xterm.js。
原生导航、通知、SecureStore、Face ID;终端区域通过 WebView 复用 Web terminal module。
Mac 主动出站连接;公网不直接暴露 tmux socket 或 Host Agent。
第一版的目标是形成可信的远程接管闭环,不是一次性把所有原生能力备齐。每一步都由真实设备证据决定下一步。
将轮询快照替换为 PTY/WebSocket,接入 xterm.js,完成认证、断线重连、离线不补发与 stale target 拒绝。
验证软键盘、横竖屏、长输出、弱网恢复、Home Screen 启动和 Web Push;记录具体摩擦,而不是预设 App 必须存在。
复用协议包与终端 Web 模块,原生实现 SecureStore、Face ID、通知动作和深链,不复制 Host Agent 或会话状态。
Evidence
生成日期:2026-08-04。方法:对照现有 React/Vite 原型,核验 xterm.js、WebKit、React Native WebView、Expo 与 Apple 官方资料。结论是架构建议,不等于已经通过 iPhone/iPad 真机验收。