Files
VibeCoding/webrtc_controller_ios
TongTongStudio 1bd0318d35 feat(ios): add online device list and pairing code redemption
- Add API methods for fetching online devices and redeeming pairing codes
- Add OnlineDevice model and corresponding ViewModel state management
- Add UI sections for online device list and pairing code input in SetupPanel
- Ensure access token is verified before connecting to signaling server
2026-08-03 21:42:31 +08:00
..

web_rtc_controller_ios

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

环境要求

  • Xcode 15 及以上
  • iOS 15.0 及以上iPhone / iPad
  • 依赖通过 Swift Package Manager 自动拉取:stasel/WebRTCGoogle 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/                 # WebRTCClientPeerConnection/DataChannel+ SelfCodecDecoder自编码 H.264 解码)
├── Views/                  # SwiftUI 页面 + UIKit 渲染/触控视图UIViewRepresentable 桥接)
├── ViewModel/              # ControllerViewModel
└── Utils/                  # 设备 ID 等工具

与 Android 端保持一致的协议

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

功能

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

录制说明

控制面板顶部「录制 / 停止」按钮用于录制远端画面,行为对齐 Android 端 VideoRecorder

  • WebRTC 模式WebRTCClient 把远端视频轨 fan-out 一份给 VideoRecorder(实现 RTCVideoRenderer 拿到解码后的 CVPixelBuffer,用 AVAssetWriter + H.264 硬编码封装为 MP4。
  • 自编码模式SelfCodecDecoder 用 VideoToolbox 硬解出 AVCC 帧后回传给 VideoRecorder 复用已解码的 H.264 帧写盘。
  • 录制文件保存在 App 沙盒 Documents/WebRTCRecordings/rec_YYYYMMDD_HHmmss.mp4,停止后弹出保存路径提示。
  • 断开连接时若仍在录制会自动取消(丢弃未保存内容)。

运行

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