在 iOS 17+ 上通过 SOCKS5 路由 URLSession WebSocket
在 iOS 17 或更高版本中通过会话级 SOCKSv5 代理配置 URLSessionWebSocketTask,并将路由与 WSS 解密分开。
iOS 应用的普通 HTTPS 请求可能出现在调试代理中,而它的 WebSocket 流量却不见踪影。先判断 WebSocket 的传输方式:URLSessionWebSocketTask 可以使用会话级代理配置,而自行打开套接字的库则需要自己受支持的集成方式。在 iOS 17+ 上使用原始 Network.framework 连接时,请配置 NWConnection 自己的代理上下文。
在 iOS 17 或更高版本上,用显式的 SOCKSv5 代理创建会话:
import Foundation
import Network
@available(iOS 17.0, *)
func makeDebugSession() -> URLSession {
let configuration = URLSessionConfiguration.default
let endpoint = NWEndpoint.hostPort(
host: "192.0.2.10", port: 8889)
configuration.proxyConfigurations = [
ProxyConfiguration(socksv5Proxy: endpoint)
]
return URLSession(configuration: configuration)
}把文档中的地址和端口换成现有调试代理可达的 SOCKS 监听器。在代理应用中启用该监听器。它的 HTTP 监听器可以位于另一个端口。
从返回的会话创建 webSocketTask。通过另一个 URLSession 创建的任务不会继承这个会话的覆盖设置。空的 proxyConfigurations 数组使用系统默认值;这并不是显式选择直连路由。
可达性与可读消息是两个独立的里程碑
实体手机需要一个能到达调试电脑的地址。在那台手机上,127.0.0.1 指的是手机自身。当连接始终无法到达时,请检查监听器的接口以及代理允许的客户端访问。
SOCKS 路由负责承载连接。要读取 wss 内容,还需要调试工具的 TLS 检查设置以及设备上的适当信任。证书固定或单独的 TLS 实现即使在流量到达监听器时也可能阻止这种检查。
连接建立后,查找 WebSocket 的交换和消息。只看到 Socket.IO 应用的一个轮询请求,并不能证明它后续的 WebSocket 传输走了同一条路由。请把这份显式的调试配置限制在应用预期的开发环境中。