2012-04-23 11 views
1


iOSアプリには、サーバーとクライアントの2つのバージョンがあります。サーバーはBonjour経由でサービスをポストし、クライアントを待ちます。クライアントはそのサービスを検索し、サーバーに接続します。その後、すべての通信はCFSocketを介して実装されました。このコードで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に接続しようとしたときに発生したエラーを修正したとは思えません。それは決して考え出さなかったでしょう!ありがとう。 –