我正在与 Charles(和 Proxyman)、web sockets 和 URLSessionWebSocketTask 进行斗争。我正在使用 URLRequest 设置 Web 套接字,设置 http 标头字段,然后从 URLSession 创建 Web 套接字任务。 这是我正在尝试以代码方式执行的操作:
self.urlSession = URLSession(
configuration: .default,
delegate: self,
delegateQueue: OperationQueue()
)
var request = URLRequest(url: url)
request.setValue("\(someValue)", forHTTPHeaderField: "a-http-header-field")
self.webSocketTask = self.urlSession?.webSocketTask(with: request)
self.webSocketTask?.resume()
self.listen() // Set up .receive and read messages from the web socket
当我在 iOS 模拟器中运行该应用程序时,我可以清楚地看到 Web 套接字已启动并使用断点、日志运行,并且我正在接收消息和发送数据。 但是,在 Charles 和 Proxyman 上,我没有看到与此 Web 套接字相关的流量。不过我可以看到许多其他网络请求。 有趣的是,当我使用 URL 创建 Web 套接字时,如下所示:
let url: URL = ...
self.webSocketTask = self.urlSession?.webSocketTask(with: url)
然后我就可以神奇地看到网络套接字的流量。 我还尝试省略在请求中设置标头值,而仅使用请求:
let request = URLRequest(url: url)
self.webSocketTask = self.urlSession?.webSocketTask(with: request)
我得到相同的结果:没有流量。
总而言之,问题是当我使用 URLRequest 设置 Web 套接字时,我在 Charles/Proxyman 上看不到任何有关该 Web 套接字流量的信息;使用 URL 我可以。
为什么会发生这种情况? 难道Charles/Proxyman无法有效拦截和解码这样的Web套接字吗?
无论 URLSessionWebSocketTask 如何初始化,我都希望看到 websocket 的流量。
我再次重现它,我相信这是苹果的一个错误。
从
URLSessionWebsocketTask
创建 URLRequest
,会导致 Websocket 永远不会通过 HTTP 代理。它直接连接到互联网。
let request = URLRequest(url: url)
self.webSocketTask = self.urlSession?.webSocketTask(with: request)
✅ 要修复它,我强烈建议使用 Proxyman 的 Atlantis 框架。
它在底层执行 Method Swizzling 来捕获 Websocket 数据并将其发送到 Proxyman 应用程序。使用
URL
或 URLRequest
。
这是示例应用程序。