# web_rtc_controller_ios

iOS 版 WebRTC 远程控制端，功能对齐 Android 端 `WebRTCController`，配合 `WebRTCSignalServer` 信令服务器与被控端 `WebRTCControlled` 使用。

## 环境要求

- Xcode 15 及以上
- iOS 15.0 及以上（iPhone / iPad）
- 依赖通过 Swift Package Manager 自动拉取：[stasel/WebRTC](https://github.com/stasel/WebRTC)（Google WebRTC 官方二进制封装）

## 架构：UIKit 与 SwiftUI 混用

| 层 | 技术 | 说明 |
| --- | --- | --- |
| 应用生命周期 | UIKit (`AppDelegate` / `SceneDelegate`) | `UIHostingController` 承载 SwiftUI 根视图 |
| 界面 | SwiftUI (`ContentView` / `AuthSheetView`) | 连接设置页、鉴权弹窗、控制面板、统计信息 |
| 视频渲染（WebRTC 模式） | UIKit (`RTCMTLVideoView`) | 经 `UIViewRepresentable` 嵌入 SwiftUI |
| 视频渲染（自编码模式） | UIKit (`AVSampleBufferDisplayLayer`) | H.264 裸流 VideoToolbox 硬解直显 |
| 触控捕获 | UIKit (`RemoteTouchView`) | 原始触摸事件实时转发，保证"跟手" |
| 状态管理 | Combine (`ControllerViewModel`) | `ObservableObject` 驱动 SwiftUI |

## 目录结构

```
web_rtc_controller_ios/
├── App/                    # UIKit 生命周期入口
├── Signaling/              # 信令：SignalMessage(JSON) + WebSocket 客户端
├── Control/                # ControlMessage：与 control_message.proto 二进制兼容的手写 protobuf 编解码
├── WebRTC/                 # WebRTCClient（PeerConnection/DataChannel）+ SelfCodecDecoder（自编码 H.264 解码）
├── Views/                  # SwiftUI 页面 + UIKit 渲染/触控视图（UIViewRepresentable 桥接）
├── ViewModel/              # ControllerViewModel
└── Utils/                  # 设备 ID 等工具
```

## 与 Android 端保持一致的协议

- **信令**（WebSocket + JSON）：`REGISTER` / `OFFER`(携带 `authType`/`authValue`) / `ANSWER` / `ICE_CANDIDATE` / `TARGET_OFFLINE` / `CONNECTION_REJECTED` / `REQUEST_ERROR` / `REQUEST_TIMEOUT`
- **控制通道** `control_channel`（可靠有序）：protobuf `ControlMessage`（MOTION_EVENT / SWIPE / KEY / SET_RESOLUTION / SET_STREAM_MODE 及被控端上报）
- **自编码视频通道** `video_channel`（不可靠低延迟）：`0xAB` 魔数分片协议（大端序），单元内为 H.264 Annex-B 裸流（CONFIG=SPS/PPS，FRAME=视频帧）
- **ICE**：`stun:stun.l.google.com:19302`、`stun:www.ttstd.com:3478`、`turn:www.ttstd.com:3478`

## 功能

- 连接信令服务器并注册（设备 ID 格式 `CTRL-XXXXXXXX`，本地持久化）
- 三种鉴权方式：免密连接 / 动态验证码 / 固定密码
- 远程屏幕实时观看 + 触控（跟手的原始 MotionEvent 转发 + 滑动补发 SWIPE）
- 导航键：返回 / 主页 / 多任务（Android keyCode 4 / 3 / 187）
- 分辨率切换：原始画质 / 1080P / 720P / 480P
- 串流模式切换：WebRTC（SRTP 视频轨）/ 自编码（DataChannel H.264 裸流 + VideoToolbox 硬解）
- 实时统计：分辨率、帧率、码率、RTT、链路类型（P2P/TURN）、编解码器等

## 运行

1. 用 Xcode 打开 `web_rtc_controller_ios.xcodeproj`，首次打开等待 SPM 解析 WebRTC 依赖。
2. 在 Signing & Capabilities 中选择自己的开发团队。
3. 真机运行（模拟器无法验证硬解与摄像头相关能力，控制功能可用）。
4. 输入信令服务器地址（默认 `wss://www.ttstd.com/signal`）与被控端设备 ID，选择鉴权方式后连接。
