Charles 和 Proxyman 在使用 URLRequest、iOS、Swift 创建 WebSocket 流量时不会显示任何 WebSocket 流量

问题描述 投票:0回答:1

我正在与 Charles(和 Proxyman)、web socketsURLSessionWebSocketTask 进行斗争。我正在使用 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 的流量。

swift networking websocket http-headers charles-proxy
1个回答
0
投票

我再次重现它,我相信这是苹果的一个错误。

URLSessionWebsocketTask
创建
URLRequest
,会导致 Websocket 永远不会通过 HTTP 代理。它直接连接到互联网。

let request = URLRequest(url: url)
self.webSocketTask = self.urlSession?.webSocketTask(with: request)

✅ 要修复它,我强烈建议使用 Proxyman 的 Atlantis 框架

它在底层执行 Method Swizzling 来捕获 Websocket 数据并将其发送到 Proxyman 应用程序。使用

URL
URLRequest

这是示例应用程序

© www.soinside.com 2019 - 2024. All rights reserved.