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 传输走了同一条路由。请把这份显式的调试配置限制在应用预期的开发环境中。

相关文章