首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用charlesproxy为iOS模拟器/设备检查websocket流量

如何使用charlesproxy为iOS模拟器/设备检查websocket流量
EN

Stack Overflow用户
提问于 2015-10-13 04:57:22
回答 4查看 36.9K关注 0票数 41

我想检查通过网络套接字的网络流量,我没有控制网络代码,因为这是一个二进制的库,我没有源代码,所以我不能做任何日志/断点在网络部分的代码。

我已经尝试使用最新版本的CharlesProxy,它声称能够嗅探websockets,但是当我尝试使用websockets的url和apis时,从我的iPhone调用的端点列表中甚至都没有提到。

我已经验证了CharlesProxy的配置是否正确,因为即使在SSL下,我也能够检查非websocket流量。

所以我的问题是:有没有人找到了用CharlesProxy检查通过websockets的流量的解决方案?

注意:我在使用iOS9时禁用了自动测试系统

谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-02-02 19:57:00

我终于找到了答案。

Charles 3.11.2与WebSocket完美配合。

我使用socketIO,所以我已经看到在协商阶段发送http请求,但是我错过了websockets流量。

在一开始,socketIO尝试使用轮询,然后切换到使用websockets。

当您转到状态为“正在发送请求正文”的请求时,可以看到websocket流量,该请求实际上是wss:// request。

你甚至有一个专门的标签来处理这种流量。其余的消息就会出现在那里。

PS1。确保您已正确连接到套接字,然后它将出现在Charles中。

PS2。我建议使用socketIO,对于像websockets这样的全双工通信来说,这是一个很好的增强。

票数 26
EN

Stack Overflow用户

发布于 2019-04-04 19:38:49

客户端更新:显然Socket.IO--swift v15.1.0现在可以正确支持SOCKS代理。我还没有尝试过,但这意味着不再需要对红蜘蛛进行这些手动编辑。

公认的答案似乎不适用于iOS设备上的Socket.IO。

最新版本的Socket.IO-Client-Swift (撰写本文时为15.0.0)在iOS/OS上使用WebSockets的Starscream

好消息是,红蜘蛛支持SOCKS代理:

  1. Socket.IO不公开红蜘蛛websocket或提供任何用于启用SOCKS代理行为的应用编程接口。
  2. 内置于红蜘蛛中的SOCKS代理使用操作系统SOCKS代理设置,这些设置很难设置(至少对于iOS)。

如果我有一些时间,我可能会提出一个PR来更彻底地解决这个问题,但考虑到它需要红蜘蛛和Socket.IO-Client-Swift的工作,这并不是完全直接的。

为了临时调试的目的(这就是Charles的用例),解决这个问题的最简单方法是将WebSocket.swift文件作为红蜘蛛的一部分进行编辑,并替换以下代码:

代码语言:javascript
运行
复制
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)
}

使用以下代码:

代码语言:javascript
运行
复制
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路由所有websockets流量。

然后,您需要确保在iOS中配置了HTTP代理设置(因为HTTP和SOCKS将使用相同的IP ),在Charles中启用了SOCKS代理,并且端口与上面代码中的端口匹配(缺省为8889)。

票数 11
EN

Stack Overflow用户

发布于 2019-05-15 01:35:31

谢谢你非常非常有帮助的回答Jonathan Ellis!我使用的是Pusher,它工作得很好!

然而,我发现socksConfig并不总是包含有效的数据,当我从那里提取IP时,它不工作或会崩溃。因为我们从那里得到的唯一东西是本地主机IP,所以我在WebSocket.swift中替换了以下内容

代码语言:javascript
运行
复制
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)
}

有了这个:

代码语言:javascript
运行
复制
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代理。

再次感谢!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33090087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档