2012-04-23 6 views
1


iOS 앱에는 서버와 클라이언트의 두 가지 버전이 있습니다. 서버는 Bonjour를 통해 서비스를 게시하고 클라이언트를 기다립니다. 클라이언트는 서비스를 검색하고 서버에 연결합니다. 그 후 모든 통신은 CFSockets을 통해 구현됩니다.
는 다음과 같은 통신 스트림을 설정하는 내 코드 :이 코드에서 SSL을 돌리면 잘 작동 부분없이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; 
} 

하지만 그렇지 않으면 내가지고있어 오류 :

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

어떤 종류의 문제가 될 수 있습니까?
감사합니다.

답변

7

에서 iOS 5에서 TLS1.2 지원 알려진 문제가 있습니다 : @에 kCFStreamSSLLevel을 설정하면 https://developer.apple.com/library/ios/#technotes/tn2287/_index.html#//apple_ref/doc/uid/DTS40011309

는 "kCFStreamSocketSecurityLevelTLSv1_0SSLv3"나는 내 응용 프로그램에서 -9800 문제를 해결할 수 있었다.

+0

여전히 같은 오류가 발생합니다. 소켓 설정 방법의 전체 목록은 http://pastebin.com/EDSnmcMd – dymv

+0

HOLY COW. Gmail에 연결하는 중에 발생하는 오류가 수정되었다고 믿을 수 없습니다. 그걸 결코 알아 내지 못했을거야! 감사. –