1


私のiOSアプリには、サーバーとクライアントの2つのバージョンが含まれています。サーバーはBonjourを介してサービスを投稿し、クライアントを待ちます。クライアントはそのサービスを検索し、サーバーに接続します。その後、すべての通信はCFSocketsを介して実装されます。
このような通信用のストリームを設定するための私のコードは次のとおりです。

- (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.)

どんな問題がありますか?
ありがとう!

4

1 に答える 1

7

iOS 5でのTLS1.2サポートには既知の問題があります:https ://developer.apple.com/library/ios/#technotes/tn2287/_index.html#//apple_ref/doc/uid/DTS40011309

kCFStreamSSLLevelを@"kCFStreamSocketSecurityLevelTLSv1_0SSLv3"に設定することで、アプリの-9800の問題を修正することができました。

于 2012-06-02T05:33:29.853 に答える