更新: 显然 socket.io-client-swift v15.1.0 现在正确支持 SOCKS 代理。我还没有尝试过,但这意味着不再需要对红蜘蛛进行这些手动编辑。
接受的答案似乎不适用于 iOS 设备上的 Socket.IO。
最新版本的 Socket.IO-Client-Swift(撰写本文时为 15.0.0)使用 Starscream 用于 iOS/OS X 上的 WebSockets。
好消息是红蜘蛛支持 SOCKS 代理:
Socket.IO 不公开 Starscream websocket 或提供任何 API 来启用 SOCKS 代理行为。
红蜘蛛内置的 SOCKS 代理使用操作系统 SOCKS 代理设置,设置起来很麻烦(至少对于 iOS)。
如果我有时间,我可能会提出一个 PR 来更彻底地解决这个问题,但鉴于它需要红蜘蛛和 Socket.IO-Client-Swift 的工作,这并不完全简单。
为了临时调试目的(这是 Charles 的用例!)解决这个问题的最简单方法是编辑 WebSocket.swift 文件作为 Starscream 的一部分,并替换以下代码:
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 路由所有 websockets 流量。
然后您需要确保在 iOS 中配置了 HTTP 代理设置(因为 HTTP 和 SOCKS 将使用相同的 IP),在 Charles 中启用了 SOCKS 代理,并且端口与上面代码中的端口匹配(默认为 8889)。