SessionPlane · Client decision

PWA 先行,
原生能力后接。

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 PushAPNs/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。

Client 01 · NowResponsive Web / PWA

session 列表、终端观察、命名、受控输入、断线与过期目标提示。

Shared coreProtocol + auth + terminal web module

TypeScript 数据合同、WebSocket 事件、目标世代校验;终端用 xterm.js。

Client 02 · LaterExpo / React Native shell

原生导航、通知、SecureStore、Face ID;终端区域通过 WebView 复用 Web terminal module。

Remote coreControl service + Mac Host Agent

Mac 主动出站连接;公网不直接暴露 tmux socket 或 Host Agent。

实施顺序。

第一版的目标是形成可信的远程接管闭环,不是一次性把所有原生能力备齐。每一步都由真实设备证据决定下一步。

把 Web 版做成可长期使用的客户端

将轮询快照替换为 PTY/WebSocket,接入 xterm.js,完成认证、断线重连、离线不补发与 stale target 拒绝。

在 iPhone/iPad 真机上连续使用

验证软键盘、横竖屏、长输出、弱网恢复、Home Screen 启动和 Web Push;记录具体摩擦,而不是预设 App 必须存在。

命中原生触发条件后做 Expo 壳

复用协议包与终端 Web 模块,原生实现 SecureStore、Face ID、通知动作和深链,不复制 Host Agent 或会话状态。

Evidence

依据与边界

生成日期:2026-08-04。方法:对照现有 React/Vite 原型,核验 xterm.js、WebKit、React Native WebView、Expo 与 Apple 官方资料。结论是架构建议,不等于已经通过 iPhone/iPad 真机验收。