在 iOS CFStreams 上设置代理不起作用
Posted
技术标签:
【中文标题】在 iOS CFStreams 上设置代理不起作用【英文标题】:Setting Proxy On iOS CFStreams Not Working 【发布时间】:2012-08-02 19:14:29 【问题描述】:我已经在我的 Mac 上设置了一个 squid http 代理,并且我已经设置了我的 Mac 以共享它的无线连接。在我手机上的 wifi 连接信息中,我设置了我的 HTTP 代理设置:
Server: 10.0.2.1
Port: 3128
Authentication: off
在我的 ios 应用程序中,我有两种访问网络的方式。对于 http 请求,我使用 NSURLRequest,对于其他 TCP 连接,我使用 AsyncSocket 库。
所有使用 NSURLRequest 的请求都使用代理没有问题(对于 SSL,代理充当 HTTP CONNECT 隧道)。但是,我似乎无法获得用于 AsyncSocket 连接的代理。
我确实更新了 AsyncSocket 库以在创建 CFStream 时调用以下内容,例如:
//for printing out the proxy settings
static void printEntry (const void* key, const void* value, void* context)
CFShow(key);
CFShow(value);
- (BOOL)createStreamsFromNative:(CFSocketNativeHandle)native error:(NSError **)errPtr
// Create the socket & streams.
CFStreamCreatePairWithSocket(kCFAllocatorDefault, native, &theReadStream, &theWriteStream);
.
.
.
CFDictionaryRef proxyDict = CFNetworkCopySystemProxySettings();
CFDictionaryApplyFunction(proxyDict, printEntry, NULL); // I see the proxy settings are correct here
CFReadStreamSetProperty(theReadStream, kCFStreamPropertyHTTPProxy, proxyDict);
CFWriteStreamSetProperty(theWriteStream, kCFStreamPropertyHTTPProxy, proxyDict);
CFRelease(proxyDict);
return YES;
我在这里遗漏了什么明显的东西?
【问题讨论】:
【参考方案1】:您没有创建CFHTTPRead
或写入流,因此套接字流被忽略
kCFStreamPropertyHTTPProxy
.
【讨论】:
【参考方案2】:来自苹果文档:
https://developer.apple.com/library/ios/#DOCUMENTATION/Networking/Conceptual/CFNetwork/CFStreamTasks/CFStreamTasks.html#//apple_ref/doc/uid/TP30001132-CH6-DontLinkElementID_16
没有任何迹象表明这不起作用。文档提到使用 CFStreams,而不是 CFHTTPStreams。
由于我无法按照文档所述运行它并且我的时间不多了,所以我实现了自己的 HTTP 代理代码,这最终变得太难了。如果配置表明设置了 HTTP 代理,我将初始连接重定向到代理并使用以下标头发起 HTTP 请求:
CONNECT <real host>:<real port> HTTP/1.1
Host: <real host>
Proxy-Connection: keep-alive
Connection: keep-alive
收到带有 200 响应代码的完整 http 响应后,我开始套接字通信,就好像直接与服务器通信(例如,调用 startTLS 开始 SSL)。
【讨论】:
以上是关于在 iOS CFStreams 上设置代理不起作用的主要内容,如果未能解决你的问题,请参考以下文章