📞 一对一通话 —— 现在走的是这几段代码
2026-08-29 · 基线 origin/master · 每一格都是真文件名(点得到的那种)
📤 我打出去
chat_screen · call_history · call_favorites · new_call
四个地方的通话键,都推开同一个页面
📥 别人打进来
home_screen.dart · _headlessJoin()
信令一到就先建会话,页面可以后到
▼ ▼
🖼️ 通话那一页只剩画面
lib/screens/call_screen.dart (1881 → 845 行)
整页 + 悬浮小窗 + 三个全局开关(通话中 / 推回页面 / 挂断口)。
这里已经没有任何通话逻辑了 —— 以前那一千行的同名会话类,今天一行都不在。
▼ 它把活全交给下面这一层
📞 一对一这一通1v1 专属
lib/services/call_session.dart (789 行) class CallSession extends CallEngine
只装"两个人打电话"才有的规矩:回铃音 · 对方没接怎么办 ·
语音留言那一整套 · 系统来电界面 · 两人都在时合并成一间房。
▼ 剩下的都在这层,和群通话共用同一份
⚙️ 通话引擎一对一 + 群通话 共用
lib/services/call_engine.dart (2278 行)
通话秒表 · 静音 · 免提 · 摄像头 · 视频中途升级 · 录音 · 屏幕共享 ·
网络质量监测 · 说话高亮 · 挂断收尾清场。
改这里,一对一和群通话同时生效 —— 这正是这次要接过来的理由。
▼
🎧 声音和画面外部
LiveKit
真正传声音/视频的那条路,不经我们后端
📡 信令外部
ws_client.dart → 后端
响铃 / 挂断 / 拒接 走这条
📱 系统来电外部
CallKit
锁屏上那个来电界面
一句话看懂这张图: 页面只管画,一对一那份只管"两个人打电话"的规矩,
剩下所有通话功能都在共用引擎里 —— 群通话走的是同一层。
⚠️ 这张图证明的是"代码怎么连的",不是"电话打得通"。
出这张图的机器编不了 iOS,真机上一通电话都没打过 —— 那要等下一班 TestFlight。
老那份代码原样存在 app/legacy/,真出事切得回去。