在 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 上设置代理不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的外观代理 (iOS)

XCode 设置以查看在以前的操作系统版本上不起作用的代码

IOS设置方向不起作用

UIlabel layer.cornerRadius在iOS 7.1中不起作用

Firebase 动态链接在 iOS 上不起作用

Next js 和 google 分析在 nginx 反向代理后面不起作用