# 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,选择鉴权方式后连接。