如何使用charlesproxy检查iOS模拟器/设备的websocket流量
我想检查通过web套接字的网络流量,我无法控制网络代码,因为这是一个二进制库,我没有源代码,因此我无法在代码的网络部分执行任何日志/断点 我尝试过使用最新版本的charlesproy,它声称能够嗅探websockets,但是当我尝试使用websockets的url和api时,我的iPhone调用的端点列表中甚至没有提到 我已经验证了CharlesProxy的配置是否正确,因为即使在SSL下,我也能够检查非websocket流量 所以我的问题是:有没有人找到了一个解决方案,用CharlesProxy检查通过WebSocket的流量 注意:我在使用iOS9时禁用了ATS如何使用charlesproxy检查iOS模拟器/设备的websocket流量,ios,sockets,websocket,charles-proxy,cfnetwork,Ios,Sockets,Websocket,Charles Proxy,Cfnetwork,我想检查通过web套接字的网络流量,我无法控制网络代码,因为这是一个二进制库,我没有源代码,因此我无法在代码的网络部分执行任何日志/断点 我尝试过使用最新版本的charlesproy,它声称能够嗅探websockets,但是当我尝试使用websockets的url和api时,我的iPhone调用的端点列表中甚至没有提到 我已经验证了CharlesProxy的配置是否正确,因为即使在SSL下,我也能够检查非websocket流量 所以我的问题是:有没有人找到了一个解决方案,用CharlesPro
谢谢 我终于找到了答案 Charles 3.11.2与WebSocket完美配合。 我使用,所以我已经看到在协商阶段发送的http请求,但是我错过了WebSocket流量。 在一开始,socketIO尝试使用轮询,然后使用交换机来使用WebSocket 当您转到状态为“Sending request body”的请求时,websocket流量是可见的,该请求实际上是wss://请求 你甚至有一个专门的标签来处理这种流量。其余消息将显示在此处 PS1。确保您已正确连接到插座,然后它将显示在Charles中。
PS2。我建议使用socketIO,这是对websockets这样的全双工通信的极大增强 更新:socket.io-client-swift v15.1.0现在正确支持SOCKS代理。我还没有尝试过,但这意味着不再需要对红蜘蛛进行手动编辑
接受的答案似乎不适用于iOS设备上的Socket.IO 最新版本的Socket.IO-Client-Swift(撰写本文时为15.0.0)用于iOS/OS X上的WebSocket 好消息是红蜘蛛支持袜子代理,但是:
WebSocket.swift
文件作为红蜘蛛的一部分,并替换此代码:
if enableSOCKSProxy {
let proxyDict = CFNetworkCopySystemProxySettings()
let socksConfig = CFDictionaryCreateMutableCopy(nil, 0, proxyDict!.takeRetainedValue())
let propertyKey = CFStreamPropertyKey(rawValue: kCFStreamPropertySOCKSProxy)
CFWriteStreamSetProperty(outputStream, propertyKey, socksConfig)
CFReadStreamSetProperty(inputStream, propertyKey, socksConfig)
}
let socksConfig = CFDictionaryCreateMutableCopy(nil, 0, CFNetworkCopySystemProxySettings()!.takeRetainedValue()) as! [String: Any]
let propertyKey = CFStreamPropertyKey(rawValue: kCFStreamPropertySOCKSProxy)
let ip = socksConfig["HTTPSProxy"]
let proxySocksConfig = ["SOCKSProxy": ip, "SOCKSPort": 8889, "SOCKSEnable": true] as CFDictionary // Where 8889 is the SOCKS proxy port in Charles
CFWriteStreamSetProperty(outputStream, propertyKey, proxySocksConfig)
CFReadStreamSetProperty(inputStream, propertyKey, proxySocksConfig)
使用此代码:
if enableSOCKSProxy {
let proxyDict = CFNetworkCopySystemProxySettings()
let socksConfig = CFDictionaryCreateMutableCopy(nil, 0, proxyDict!.takeRetainedValue())
let propertyKey = CFStreamPropertyKey(rawValue: kCFStreamPropertySOCKSProxy)
CFWriteStreamSetProperty(outputStream, propertyKey, socksConfig)
CFReadStreamSetProperty(inputStream, propertyKey, socksConfig)
}
let socksConfig = CFDictionaryCreateMutableCopy(nil, 0, CFNetworkCopySystemProxySettings()!.takeRetainedValue()) as! [String: Any]
let propertyKey = CFStreamPropertyKey(rawValue: kCFStreamPropertySOCKSProxy)
let ip = socksConfig["HTTPSProxy"]
let proxySocksConfig = ["SOCKSProxy": ip, "SOCKSPort": 8889, "SOCKSEnable": true] as CFDictionary // Where 8889 is the SOCKS proxy port in Charles
CFWriteStreamSetProperty(outputStream, propertyKey, proxySocksConfig)
CFReadStreamSetProperty(inputStream, propertyKey, proxySocksConfig)
这将确保默认情况下启用SOCKS代理,并通过Charles路由所有WebSocket流量
然后,您需要确保在iOS中配置HTTP代理设置(因为相同的IP将用于HTTP和SOCKS),在Charles中启用SOCKS代理,并且端口与上面代码中的端口匹配(默认为8889)。感谢您非常有用的回答Jonathan Ellis! 我用的是Pusher,效果很好 但是,我发现
socksConfig
并不总是包含有效数据,当我从那里提取IP时,它不工作或会使应用程序崩溃。因为我们从那里得到的唯一东西是本地主机IP,所以我在WebSocket.swift
if enableSOCKSProxy {
let proxyDict = CFNetworkCopySystemProxySettings()
let socksConfig = CFDictionaryCreateMutableCopy(nil, 0, proxyDict!.takeRetainedValue())
let propertyKey = CFStreamPropertyKey(rawValue: kCFStreamPropertySOCKSProxy)
CFWriteStreamSetProperty(outputStream, propertyKey, socksConfig)
CFReadStreamSetProperty(inputStream, propertyKey, socksConfig)
}
为此:
let propertyKey = CFStreamPropertyKey(rawValue: kCFStreamPropertySOCKSProxy)
let proxySocksConfig = ["SOCKSProxy": "127.0.0.1", "SOCKSPort": 8889, "SOCKSEnable": true] as CFDictionary // Where 8889 is the SOCKS proxy port in Charles
CFWriteStreamSetProperty(outputStream, propertyKey, proxySocksConfig)
CFReadStreamSetProperty(inputStream, propertyKey, proxySocksConfig)
然后在Charles中启用socks代理,如您所述
再次感谢 找到了解决方案: 在尝试之后,我得出结论,尽管iOS模拟器遵循HTTP的系统代理设置,但没有遵循WebSocket。也不遵循Socks5代理设置。 但是,我们可以在Charles中使用
反向代理
,强制模拟器使用它。
在Charles中,单击
Proxy->Reverse Proxy
,设置一个本地地址作为WebSocket服务器的透明代理,然后在新WebSocket()中使用该地址(在React Native的情况下很好),然后您可以在Charles中看到您的WebSocket连接您解决了问题吗?我有Charles 3.11.2,但仍然看不到websocket流量。我在Charles中看不到来自ios的websocket,但是,当从JavaScription启动时,我可以看到它们。你找到这个问题的答案了吗?@AndrewPaulSimmons是的,它可以与设备以及模拟器一起工作。在“代理设置>启用Socks代理”中。在SOCKS上启用HTTP代理可能也会有所帮助。我们正在使用红蜘蛛,WS数据没有被获取!我几乎要把Wireshark作为一个替代方案,问题是关于iOS模拟器的web套接字。通过JS发送时,Charles看到web套接字没有问题。更新WebSocket.swift后,它对我仍然不起作用。你能把最后一节的内容扩展一下吗?我在Charles和port比赛中启用了SOCKS代理,但我想知道我是否错过了什么。没关系。我让它工作了。我没有注意到enableSOCKSProxy必须为true。如果替换整个部分,包括如果enableSOCKSProxy{…}
,则不需要设置enableSOCKSProxy=true
,默认情况下所有连接都将启用它。。。。