Ios CFNetwork持久连接(保持有效)

Ios CFNetwork持久连接(保持有效),ios,http,cfnetwork,persistent-connection,Ios,Http,Cfnetwork,Persistent Connection,我试图通过Apple网络框架使用持久HTTP连接来减少服务器开销。然而,几乎没有关于它的文档。我能找到的唯一信息表明,只要设置了适当的标志,框架就可以代表开发人员回收流: CFHTTPMessageRef request = CFHTTPMessageCreateRequest(kCFAllocatorDefault, methodString, url, kCFHTTPVersion1_1); CFHTTPMessageSetHeaderFieldValue(r

我试图通过Apple网络框架使用持久HTTP连接来减少服务器开销。然而,几乎没有关于它的文档。我能找到的唯一信息表明,只要设置了适当的标志,框架就可以代表开发人员回收流:

        CFHTTPMessageRef request = CFHTTPMessageCreateRequest(kCFAllocatorDefault, methodString, url, kCFHTTPVersion1_1);
        CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Keep-Alive"), CFSTR("120")); <--- This line

        //Set message body if we're posting
        if (msDetails.eType == HttpRequestDetails::POST)
        {
            CFDataRef bodyRef = CFDataCreate(kCFAllocatorDefault, (const UInt8*)msDetails.strBody.c_str(), msDetails.strBody.length());
            CFHTTPMessageSetBody(request, bodyRef);
            CFRelease(bodyRef); 
        }

        //Create the read stream...
        CFReadStreamRef ReadStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, request);

        //...use persistent connections..
        CFReadStreamSetProperty(ReadStream, kCFStreamPropertyHTTPAttemptPersistentConnection, kCFBooleanTrue); <--- This line

        //...enable SSL if the URL is https
        if(msDetails.strURL[4] == 's')
        {
            //Hey an https request
            CFMutableDictionaryRef pDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
            CFDictionarySetValue(pDict, kCFStreamSSLValidatesCertificateChain, kCFBooleanFalse);
            CFDictionarySetValue(pDict, kCFStreamPropertySocketSecurityLevel, kCFStreamSocketSecurityLevelSSLv3);
            CFReadStreamSetProperty(ReadStream, kCFStreamPropertySSLSettings, pDict);
            CFRelease(pDict);
        }

        CFReadStreamOpen(ReadStream);
上述代码导致CFNetwork内部错误。如果删除CFReadStreamSetPropertyReadStream、KCFStreamPropertyHTTPEntConnection、kCFBooleanTrue调用,则不再收到错误。还值得一提的是,我在读取完数据后关闭了readstream,但也许我需要自己管理流池

有人有任何文档、示例或教程可供我参考吗?我渴望继续使用CFNetwork,因为我们有一个客户坚持我们必须尽量减少使用Obj-C。

添加CFNetwork.framework

并导入

添加CFNetwork.framework


导入

我一直在为同样的事情挣扎


看来关键是要确保请求的所有流设置完全相同。特别是,对于所有请求,必须将完全相同的dictionary对象传递给kCFStreamPropertySSLSettings。仅仅有相同的内容是不够的,你必须重复使用完全相同的词典。

我一直在为同样的事情苦苦挣扎


看来关键是要确保请求的所有流设置完全相同。特别是,对于所有请求,必须将完全相同的dictionary对象传递给kCFStreamPropertySSLSettings。仅仅有相同的内容是不够的,你必须重复使用完全相同的词典。

我找到了关于这个主题的更多信息。显然,CFNetwork将在开放流调用上重新使用开放连接。如果没有打开的连接,那么它将打开一个新的连接。如果您想要持久连接,则必须保持它们处于打开状态。这意味着您必须在打开一个新流之前确定当前是否有一个到域的连接,该流将重新使用现有连接,然后关闭旧流。我找到了有关此主题的更多信息。显然,CFNetwork将在开放流调用上重新使用开放连接。如果没有打开的连接,那么它将打开一个新的连接。如果您想要持久连接,则必须保持它们处于打开状态。这意味着您必须在打开一个新流之前确定当前是否有与域的连接打开,该新流将重新使用现有连接,然后关闭旧流。我不确定我是否理解您的答案。这有助于实现与CFHTTPStream的持久连接吗?我不确定我是否理解您的答案。这如何帮助启用与CFHTTPStream的持久连接?