2012-04-23 53 views
1


我的iOS應用程序包含2個版本:服務器和客戶端。服務器通過Bonjour發佈服務並等待客戶端。客戶端搜索該服務並連接到服務器。之後通過CFSockets實現所有通信。
這裏是我的代碼來設置流這樣的通信:CFStream SSL錯誤-9800

- (BOOL)setupSocketStreams { 
if (readStream == nil || writeStream == nil) { 
    return NO; 
} 
incomingDataBuffer = [[NSMutableData alloc] init]; 
outgoingDataBuffer = [[NSMutableData alloc] init]; 

// Turning SSL on 
NSDictionary *sslSettings = [NSDictionary dictionaryWithObjectsAndKeys:(id)kCFBooleanFalse, (id)kCFStreamSSLValidatesCertificateChain, nil]; 
CFReadStreamSetProperty(readStream, kCFStreamPropertySocketSecurityLevel, kCFStreamSocketSecurityLevelNegotiatedSSL); 
CFReadStreamSetProperty(readStream, kCFStreamPropertySSLSettings, sslSettings); 
CFWriteStreamSetProperty(writeStream, kCFStreamPropertySocketSecurityLevel, kCFStreamSocketSecurityLevelNegotiatedSSL); 
CFWriteStreamSetProperty(writeStream, kCFStreamPropertySSLSettings, sslSettings); 

CFReadStreamSetProperty(
     readStream, 
     kCFStreamPropertyShouldCloseNativeSocket, 
     kCFBooleanTrue 
); 
CFWriteStreamSetProperty(
     writeStream, 
     kCFStreamPropertyShouldCloseNativeSocket, 
     kCFBooleanTrue 
); 

CFOptionFlags registeredEvents = 
     kCFStreamEventOpenCompleted  | 
       kCFStreamEventHasBytesAvailable | 
       kCFStreamEventCanAcceptBytes | 
       kCFStreamEventEndEncountered | 
       kCFStreamEventErrorOccurred 
; 

CFStreamClientContext ctx = { 
     0,  // version 
     self, // info 
     NULL, // retain callback 
     NULL, // release callback 
     NULL // copyDescription callback 
}; 

CFReadStreamSetClient(
     readStream, 
     registeredEvents, 
     readStreamEventHandler, 
     &ctx 
); 
CFWriteStreamSetClient(
     writeStream, 
     registeredEvents, 
     writeStreamEventHandler, 
     &ctx 
); 

CFReadStreamScheduleWithRunLoop(
     readStream, 
     CFRunLoopGetCurrent(), 
     kCFRunLoopCommonModes 
); 
CFWriteStreamScheduleWithRunLoop(
     writeStream, 
     CFRunLoopGetCurrent(), 
     kCFRunLoopCommonModes 
); 

if (! CFReadStreamOpen(readStream) || ! CFWriteStreamOpen(writeStream)) { 
    [self close]; 
    return NO; 
} 

if ([self.delegate respondsToSelector:@selector(establishedConnection:)]) { 
    [self.delegate establishedConnection:self]; 
} 

return YES; 
} 

沒有部分,在這個代碼打開SSL工作正常,但除此之外,我收到提示:

Error: 
The operation couldn’t be completed. (OSStatus error -9800.) 

什麼樣的問題可以解決嗎?
謝謝!

回答

7

沒有爲TLS1.2的支持iOS 5中的已知問題:https://developer.apple.com/library/ios/#technotes/tn2287/_index.html#//apple_ref/doc/uid/DTS40011309

通過kCFStreamSSLLevel設置爲@「kCFStreamSocketSecurityLevelTLSv1_0SSLv3」我能解決這個問題-9800在我的應用程序。

+0

仍然收到相同的錯誤。位於此處的套接字設置方法的完整列表http://pastebin.com/EDSnmcMd – dymv 2012-07-26 09:43:48

+0

HOLY COW。無法相信修復了我嘗試連接到Gmail的錯誤。永遠都不會想出來!謝謝。 – 2012-08-03 22:31:22